Páginas

quinta-feira, 13 de novembro de 2014

Database Link para Firebird (pr-br)

Trabalho como analista de sistemas e tenho contato com alguns gerenciadores de banco de dados, Postgres, Oracle e meu favorito, Firebird.

Há uns 4 anos, aprendi a utilizar um recurso chamado DBLINK, um modulo adicional do Postgres, que permite estabelecer conexão a outra base de dados, inclusive remota.
Também tive a oportunidade de utilizar um recurso bastante semelhante no Oracle, o Database Link.
Então, fiquei intrigado sobre ter este recurso no Firebird, pois em determinados casos, isto é util.



Por exemplo: tenho uma situação de uma base de dados, com cadastro de endereços de pessoas, mas eu nao guardo nesta base os nomes das ruas, nem o codigo postal (CEP) e nem bairro, guardo apenas um codigo do logradouro.
Numa outra base de dados, tenho todos os cadastros de logradouros, cep, bairros e municipios do país todos.
Eu poderia fazer isso na mesma base do meu sistema, mas esta base especifica de endereços, esta no padrão dos correios, sofre atualização quase que anual e é referenciado pelo, via DBLINK, por varios outros sistemas.
Então, imagina que, sem o DBLINK, todos os sistemas teriam que ter uma cópia própria dos dados.

Eu gostaria de ter isso no Firebird, mas nao encontrei, fui em sites que possuem foruns, artigos, dicas sobre ele, mas nada deste recurso, apenas conselhos de que isso pode ser feito via aplicação e uma promessa para a versão "2.5".
Então, via aplicação quer dizer que o sistema que for utilizar dados de bases diferentes, precisa estabelecer conexão em cada base, sendo a base principal e a outra, no caso, de endereços.
Não seria possivel usar o recurso em apenas um "select", mas usar os recursos da linguagem de programação, seja ele java, php ou delphi.
Então, decidi que seria interessante e util adicionar este recurso.
Utilizei para isso a capacidade do Firebird de aceitar Funções Externas (UDF) e poder fazer chamadas de funções escritas em outras linguagens, como C++ ou Delphi.
Estou habituado ao Delphi, ambiente Windows, portanto escrevi a biblioteca para estas caracteristicas.
Estou disponibilizando um conjunto de arquivos, onde tem-se do tipo DLL e SQL.
Voce deve tomar as providencias de copiar o arquivo DLL na pasta destinada a isso, da instalação do Firebird.
No meu caso, copiei para: "C:\Program Files\Firebird\Firebird_2_1\UDF"
Onde, inclusive, ja tem alguns arquivos distribuidos.
Depois, abra o arquivo SQL e utilizando uma ferramenta de manipulação de base de dados SQL (IBConsole ou outro), faça executar os scripts.
Observe os exemplos de "select", do proprio arquivo SQL e faça seus testes.
Esta biblioteca de funções utiliza o ODBC para fazer as conexões, assim, é possivel fazer a conexão com muitos bancos de dados e até Excel, sem precisar utilizar recursos exclusivos para cada tipo de banco, seria como algo generico.
Fiz diversos testes, conectando ao proprio Firebird, além de poder também, buscar dados de outros SGDBs.
Testei Postgres e Oracle, acredito que se instalar um driver ODBC para mySQL, também seja possivel conectar.
Testei com Excel e funcionou.
Então isto tudo dá boas possibilidades.

Requisitos e Ambiente de testes:
Firebird 2.1
Windos 7 32bits
ODBC e drivers especificos para as conexões desejadas (Drive para PG, Drive para Oracle)
Colocar o arquivo DLL no local adequado ao Firebird.
Rodar o conteudo do arquivo SQL, que contem a declaração das UDF e uma "Stored Procedure" que esta pronta para uso.

Exemplos de consultas:

Select * From dbquery('DBNAME','select * from table_name') ;

Select c.*, t.field2, t.field3
From dbquery('DBNAME','select * from table_name') as t
Join tbl_local c On c.local_key = trim(t.field1) ;

Select *
From dbquery('DBNAME; PASSWORD=12345; USER ID=dbadmin',
'
Select * From table_name
 Where rownum <= 10000
') ;

Select 'p1' pla, p1.* From dbquery('XLS_FILE','select * from "SHEET NAME1$"') p1
Where recnum <= 2254
Union
Select 'p2' pla, p2.* From dbquery('XLS_FILE','select * from "SHEET NAME2$"') p2
Where recnum <= 314

Um comentário:

  1. Olá, sou o Paulo Quicoli, editor da Clube Delphi. Gostaria de convidá-lo a escrever um artigo em nossa revista sobre essa sua solução, que é muito interessante! Posso lhe dar mais detalhes, entre em contato: pauloquicoli@gmail.com

    ResponderExcluir