quarta-feira, 28 de maio de 2008

Zeos, Postgres e Stored Procedures

Olá! Enfim um tópico que reflete o objetivo do blog. =D

Se quiser ir direto à solução, acesse:
http://www.activedelphi.com.br/forum/viewtopic.php?t=40660

1ª Parte: O Problema

Um colega de profissão, Leonardo, me mandou um e-mail nestes últimos dias, com a seguinte situação:

Migrar do SQL Server para PostgreSQL. Porém usa-se extensivamente storeds procedures, sendo necessário usar o TZStoredProc para facilitar esta migração.

Problema: Ao executar a Stored Procedure dá a seguinte mensagem de erro: unssuported function.

Ambiente: Delphi 7, ZeosLib 6.5.1, PostgreSQL 8.2


Pois bem, este assunto estava na fila já faz tempo e resolvi encarar o problema de frente.

Pergunta: Da onde vem esta mensagem?

Nos fontes do Zeos, procurei a mensagem de erro. Fui encontrar em ZMessages, sendo que ele alimenta uma variável chamada SUnsupportedOperation.

Daí corri atrás da SUnsupportedOperation e vi que ela é usada em vários lugares, a fim de gerar exceptions, em especial, nas operações não suportadas, ou seja, nas que ainda não foram implementas.

Abaixo um print do Call Stack até chegar na mensagem de erro:



Outra coisa interessante é que os parâmetros (no caso os de input) não seguiram em frente também.

Afunilando mais ainda, percebi que o problema está em CreateCallableStatement, presente na classe TZAbstractConnection. As classes descendentes desta, precisam reescrever este método, do contrário ela gera o exception. E isso não foi feito em TZPostgreSQLConnection, declarada em ZdbcPostgreSql.

Logo...

O TZStoredProc não serve para nada em relação ao PostgreSQL.

2ª Parte: A solução para quem usa a versão 6.6.1

A partir da versão 6.6.1, tudo o que escrevi aqui na parte de cima virou passado, mas continou sendo problemático usar a TZStoredProc com o PostgreSQL.

Neste meio tempo o Leonardo postou esta dúvida no fórum do Active Delphi e o Marcos Thomaz disponibilizou um componente que ele desenvolveu, o TZFunction.

Acompanhe o tópico:

http://www.activedelphi.com.br/forum/viewtopic.php?t=40660

Link para o componente TZFunction:

http://ube-167.pop.com.br/repositorio/28488/meusite/ZFunction.zip

Por enquanto é isto.

Devo voltar neste assunto nos próximos tópico.

Um comentário:

Nice disse...

Estou atrás desta solução, pois enfrento o mesmo problema com o oracle no que diz respeito a Stored Procedure. O link do componente citado não está mais no ar. Alguém poderia me ajudar? Obrigada

Minha lista de blogs