Como fazer um aplicativo criar Stored Procedures em Run Time
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]
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
Curtidas 0
Respostas
Bruno Belchior
05/09/2005
tente alterar o finalizador de comando...
Set Term ^ ; create procedure .... end; Set Term ; ^
GOSTEI 0
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.
´Token Unknown - line 7, char 92 ?´
Mas desde ja agradeço toda e qualquer ajuda.
GOSTEI 0
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!!!
´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
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
05/09/2005
Martins, no momento em q o ClientDataSet recebe a instrucao, ele recebe o seguinte valor:
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
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.
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
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
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
05/09/2005
ClientDataSets não são feitos para rodar comandos DDL e não é possível criar SPs com eles.
T+
T+
GOSTEI 0
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