Por que o Exception não é retornado???
Pessoal, criei uma stored procedure com o seguinte conteúdo:
[b:0bd315089b]DÚVIDA:[/b:0bd315089b]
Ao chamar esta procedure no Delphi, caso ocorra algum erro durante sua execução não deveria retornar a exceção que eu criei com o nome de My_Exception?
Como faço para que o delphi receba a mensagem de erro emitida pela Exception?
desde já agradeço.
begin select count(NUM) as NN from TAB1 into :RESP; when any do begin exception My_Exception; end end
[b:0bd315089b]DÚVIDA:[/b:0bd315089b]
Ao chamar esta procedure no Delphi, caso ocorra algum erro durante sua execução não deveria retornar a exceção que eu criei com o nome de My_Exception?
Como faço para que o delphi receba a mensagem de erro emitida pela Exception?
desde já agradeço.
Rtava
Curtidas 0
Respostas
Rtava
07/02/2006
uma outra forma que estou utilizando a exceção e mesmo assim não consigo capturá-la no Delphi, é a seguinte:
Executando esta stored procedure no IB Expert funciona corretamente e a mensagem da exceção que criei com nome ´axaxax´ é retornada na tela em forma de caixa de diálogo. Porém, chamando a stored procedure a partir do Delphi não é emitido nenhuma mensagem de nenhum tipo. Esta stored procedure tem o nome dew ´AAAAA´. A forma como estou fazendo sua chamada no Delphi é: Select ax from AAAAA
[b:e2c2359231]Será que pode ser problema do driver ODBC que estou usando? Ou será que é problema de sintaxe mesmo?[/b:e2c2359231]
begin select count(email_spool.id_spool) as NN from email_spool into :AX; suspend; when any do begin exception axaxax; end end
Executando esta stored procedure no IB Expert funciona corretamente e a mensagem da exceção que criei com nome ´axaxax´ é retornada na tela em forma de caixa de diálogo. Porém, chamando a stored procedure a partir do Delphi não é emitido nenhuma mensagem de nenhum tipo. Esta stored procedure tem o nome dew ´AAAAA´. A forma como estou fazendo sua chamada no Delphi é: Select ax from AAAAA
[b:e2c2359231]Será que pode ser problema do driver ODBC que estou usando? Ou será que é problema de sintaxe mesmo?[/b:e2c2359231]
GOSTEI 0
Rtava
07/02/2006
resolvido... supondo uma stored procedure chamada NEW_PROCEDURE:
A chamada da Stored Procedure tem que ser assim:
O valor retornado pela variável RESP será sempre -999 caso a procedure seja executada com sucesso. Caso contrário, se ocorrer erro, será retornado uma exceção com o texto que defini na Exception de nome ´My_Exception´.
Para ler o valor da variável RESP da procedure:
begin RESP = -999; select count(NUM) as NN from TAB1 into :RESP; when any do begin exception My_Exception; end end
A chamada da Stored Procedure tem que ser assim:
with qrAtual do begin Close; SQL.Clear; sql.Add(´EXECUTE PROCEDURE NEW_PROCEDURE´); open; end;
O valor retornado pela variável RESP será sempre -999 caso a procedure seja executada com sucesso. Caso contrário, se ocorrer erro, será retornado uma exceção com o texto que defini na Exception de nome ´My_Exception´.
Para ler o valor da variável RESP da procedure:
showmessage(qrAtual.fieldbyname(´RESP´).AsString);
GOSTEI 0
Rtava
07/02/2006
só mais uma coisinha: Esse ´qrAtual´ que usei aí, no Delphi, é um componente TADOQuery.
GOSTEI 0
Rtava
07/02/2006
corrigindo a afirmação de que não é possível pegar o número da exception gerado pelo FB:
Usando ADO, basta inserir um objeto TADOStoredProc, atribuir o objeto de conexão à propriedade ´Connection´ do mesmo, em seguida escolhe a Stored Procedure desejada, indicando-a na propriedade ´ProcedureName´ (a Stored Procedure já tem que estar criada no BD, claro), e pronto.
Para chamar a Stored Procedure a partir do Delphi basta fazer:
Para ler o valor da resposta da Stored Procedure, seja resposta de erro ou resposta de processamento OK, basta fazer:
Onde: ´err_code´ é o nome de minha variável de saída na Stored Procedure, que criei com nome ´TEST´, tal como segue:
Se a procedure for executada com sucesso, a variável ´err_code´ retornará ZERO. Caso contrário, retornará o valor do erro.
Usando ADO, basta inserir um objeto TADOStoredProc, atribuir o objeto de conexão à propriedade ´Connection´ do mesmo, em seguida escolhe a Stored Procedure desejada, indicando-a na propriedade ´ProcedureName´ (a Stored Procedure já tem que estar criada no BD, claro), e pronto.
Para chamar a Stored Procedure a partir do Delphi basta fazer:
ADOStoredProc.ExecProc;
Para ler o valor da resposta da Stored Procedure, seja resposta de erro ou resposta de processamento OK, basta fazer:
ShowMessage(IntToStr(ADOStoredProc.Parameters.FindParam(´err_code´).Value));
Onde: ´err_code´ é o nome de minha variável de saída na Stored Procedure, que criei com nome ´TEST´, tal como segue:
SET TERM ^ ; CREATE PROCEDURE TEST RETURNS ( ERR_CODE INTEGER) AS begin err_code = 0; insert into TAB1 (TAB1.id, TAB1.DATA, TAB1.val) values (111,´2000/05/05 10:10:12´, ´MAMAMA´); when any do err_code = sqlcode; end ^ SET TERM ; ^ GRANT INSERT ON LOGS TO PROCEDURE TEST; GRANT EXECUTE ON PROCEDURE TEST TO SYSDBA;
Se a procedure for executada com sucesso, a variável ´err_code´ retornará ZERO. Caso contrário, retornará o valor do erro.
GOSTEI 0