Como fazer um aplicativo criar Stored Procedures em Run Time

Firebird

05/09/2005

Bom dia a todos.

Estou utilizando D7, IB/FB, DBExpress,e estou com o seguinte problema:

Minha aplicação precisa criar Stored Procedures no banco em tempo de execução, para isto, criei uma rotina que ira gerar as SP de acordo com alguns parametros passados, estas SP serão utilizadas por outro modulo do sistema, o codigo desenvolvido foi o seguinte:

Procedure CriaProcedure(Campo1, Campo2, CampoID, Tabela : String; ID : Integer);
Var
Begin
ClientDataSet1.Close;
ClientDataSet1.CommandText:=´Create Procedure SPR´+IntToStr(ID)+#13+
´(ID Integer) Returns (Soma Double Precision) ´+13+
´As ´+13+
´ Declare variable V1 Double Precision;´+13+
´ Declare variable V2 Double Precision;´+13+
´Begin ´+13+
´ Select Sum(´+Campo1+´) From ´+Tabela+´ Where ´+CampoID+´=´+IntToStr(ID)+´ Into :V1;´+13+
´ Select Sum(´+Campo2+´) From ´+Tabela+´ Where ´+CampoID+´=´+IntToStr(ID)+´ Into :V2;´+13+
´Soma=V1+V2;´+#13+
´Suspend;´+13+
´End ´;

ClientDataSet1.Execute;

End;

Este é apenas um codigo primario :D , apenas para exemplificar meu problema, a finalidade da SP seria realizar uma consulta de valores no banco e retornar a soma dos mesmos, quando eu crio a SP pelo banco ela é criada corretamente porem quando tento criar a SP pela aplicação ela me retorna o erro de Caracter desconhecido ´?´, pelo que pude perceber, sempre que minha aplicação tenta criar a SP onde exista uma instrução Select dentro dela este erro ocorre, visto que, em um dos meus testes, retirei as instrucoes selects da rotina, deixando apenas a soma ´Soma=V1+V2;´ dentro da SP e a mesma foi gerada corretamente no Banco. Alguem teria alguma sugestão ou saberia o porque ou de que outra forma eu poderia fazer com que minha aplicação crie SP no banco em tempo de execução? :(

Desde ja agradeço a qualquer auxilio. :P

[color=green:842c5834e3]Movido de Delphi para Interbase/Firebird[/color:842c5834e3]


Arc@njo

Arc@njo

Curtidas 0

Respostas

Bruno Belchior

Bruno Belchior

05/09/2005

tente alterar o finalizador de comando...
Set Term ^ ;
create procedure 
  ....
end;
Set Term ; ^



GOSTEI 0
Arc@njo

Arc@njo

05/09/2005

Bruno, não é este o problema, eu consigo gerar a Stored Procedure no banco, mesmo sem os finalizadores (Set Term, ja tentei usando os mesmos, acrescentando-os ao inicio e final da atribuição do CommandText, mas ai da erro também), a Stored Procedure é criada somente quando não faço uso de instrução Select dentro dela, somente se usar calculos comuns, sem select, quanto utilizo qualquer instrução Select ocorre o seguinte erro:

´Token Unknown - line 7, char 92 ?´

Mas desde ja agradeço toda e qualquer ajuda.


GOSTEI 0
Martins

Martins

05/09/2005

[quote:7a13611c71=´Arc@njo´]Bruno, não é este o problema, eu consigo gerar a Stored Procedure no banco, mesmo sem os finalizadores (Set Term, ja tentei usando os mesmos, acrescentando-os ao inicio e final da atribuição do CommandText, mas ai da erro também), a Stored Procedure é criada somente quando não faço uso de instrução Select dentro dela, somente se usar calculos comuns, sem select, quanto utilizo qualquer instrução Select ocorre o seguinte erro:

´Token Unknown - line 7, char 92 ?´

Mas desde ja agradeço toda e qualquer ajuda.[/quote:7a13611c71]

Certo, se o probleam é só quando vc usa [b:7a13611c71]Select[/b:7a13611c71], e estamos vendo q as condições do seu select estão em campo1 e campo2 q são variáveis String, vc já testou passando essas condições sem utilizar essa sua função só para checar onde pode está o erro, pode ser algo na digitação, reveja sua procedure, veja-a no SQL Editor do IB, e veja se ela roda, pq se ela rodar, deve ser algo na sua func. mesmo, mas antes esgote todas as possibilidades.

Boa Sorte!!!


GOSTEI 0
Gandalf.nho

Gandalf.nho

05/09/2005

Componentes query normais não são muito adequados para processar comandos de criação de SPs e triggers. Se vc estivesse usando o IBX, poderia usar o componente IBScript, outra sugestão seria passar seu script diretamente para o Isql (utilitário de linha de comando do IB/FB) processar


GOSTEI 0
Arc@njo

Arc@njo

05/09/2005

Martins, no momento em q o ClientDataSet recebe a instrucao, ele recebe o seguinte valor:
Create Procedure SPR1 (ID Integer) Returns (Soma Double Precision) 
As 
 Declare variable V1 Double Precision;
 Declare variable V2 Double Precision;
Begin 
 Select Sum(VALOR) From VALORESMENSAIS Where IDVALORES=1 Into :V1;
 Select Sum(JUROS) From VALORESMENSAIS Where IDVALORES=1 Into :V2;
Soma=V1+V2;
Suspend;
End 


Para desencargo de consciencia, peguei este codigo e o executei pelo IBConsole, a Stored prodecure foi gerada corretamente, sem problema algum, conclui então q o erro não esta no codigo e sim em alguma falha no momento da geração da Stored Procedure atraves da aplicação.

Entretanto, quando o aplicativo gera um codigo semelhante a este
Create Procedure SPR1 (ID Integer) Returns (Soma Double Precision) 
As 
 Declare variable V1 Double Precision;
 Declare variable V2 Double Precision;
Begin 
  V1=10;
  V2=20;
  Soma=V1+V2;
Suspend;
End 


A Stored procedure é criada atraves da aplicação. Pode ser então que seja alguma falha do componente, sendo assim, que componente devo utilizar para criar as SP pela Aplicação, visto que minha aplicação faz uso de DBExpress e o componente que em q o ClientDataSet esta ligado é um DataSetProvider que esta ligado a um SQLDataSet?

gandalf.nho, no caso não faço uso do IBX, seria o caso de utiliza-lo? Mesmo que minha aplicação faça uso de DBExpress?

Desde ja agradeço a toda ajuda.


GOSTEI 0
Gandalf.nho

Gandalf.nho

05/09/2005

Vc poderia experimentar usar só o IbScript dessa paleta ou como falei acima, passe seu script diretamente ao Isql


GOSTEI 0
Martins

Martins

05/09/2005

Vc poderia experimentar usar só o IbScript dessa paleta ou como falei acima, passe seu script diretamente ao Isql


Concordo plenamente com vc [b:4e65a28a18]gandalf.nh[/b:4e65a28a18], e acho q o melhor para ele seria utilizar [b:4e65a28a18]Isql[/b:4e65a28a18], claro q ele pode testar tb o IbScript, teste as duas opções e veja qual melhor se adequa a seu projeto.


Boa Sorte!!!


GOSTEI 0
Afarias

Afarias

05/09/2005

ClientDataSets não são feitos para rodar comandos DDL e não é possível criar SPs com eles.


T+


GOSTEI 0
Martins

Martins

05/09/2005

ClientDataSets não são feitos para rodar comandos DDL e não é possível criar SPs com eles. T+


Anotei mais essa!!!


GOSTEI 0
POSTAR