Como Enviar uma mensagem de Erro pela Store Procedure - INte
No Delphi, faço..
Try
//comandos
Except
//comandos
End;
Se der algum erro ele vai para o Except.. E no Interbase, em uma Store Procedure, como faço para mandar uma mensagem de erro..
Vi alguma coisa sobre EXCEPTION, mas não consegui implementar.
Try
//comandos
Except
//comandos
End;
Se der algum erro ele vai para o Except.. E no Interbase, em uma Store Procedure, como faço para mandar uma mensagem de erro..
Vi alguma coisa sobre EXCEPTION, mas não consegui implementar.
Sistemp
Curtidas 0
Respostas
Afarias
23/10/2004
Criando uma exceção::
Capturando um erro dentro do procedimento::
use [b:241dda622c]ANY[/b:241dda622c] quando desejar pegar QUALQUER ERRO
Para ´executar´ uma exceção no código, use::
exemplos::
T+
create exception nome_da_exception ´texto da exception´;
Capturando um erro dentro do procedimento::
{ comandos }
when do
;
onde pode ser:
exception nome_da_exception {exceção}
sqlcode código {código de erro SQL}
gdscode código {código de erro do IB}
ANY
use [b:241dda622c]ANY[/b:241dda622c] quando desejar pegar QUALQUER ERRO
Para ´executar´ uma exceção no código, use::
exception nome_da_exception;
exemplos::
when sqlcode -803 do
when ANY do exception nome_da_exception;
if (valor < 0) then exception nome_da_exception
T+
GOSTEI 0
Rtava
23/10/2004
Sistemp, fiz a seguinte Stored Procedure para resolver este problema:
Em meu código na verdade tem mais coisas, mas aqui é só pra exemplificar.
Em minha tabela LOGS, eu preciso saber se já existe um outro registro igual ao que estou inserindo. Para isso existem campos únicos na tabela (indicados no código), em que ao inserir outro registro com estes códigos iguais aos de outro registro, então o BD gera um Exception. No caso de registro duplicado, a variável SQLCODE, interna do Firebid, é carregada com valor -803, que entra no tratamento de exceções do ´when´, retornado ao programa o valor textual do Exception que chamei de MY_EXCEPTION_1. Para qualquer outro erro que ocorrer, será retornado o valor do Exception MY_EXCEPTION_2.
Para chamar esta Stored Procedure de seu código no Delhi, faça assim:
Para ver o conteúdo da variável de saída da procedure, variável que chamei de ´AAA´, faça assim:
OBS.: Se ocorrer um erro qualquer na execução desta stored procedure, que chamei de ´NEW_PROCEDURE´, então a variável ´AAA´ retornará NULL. Se a procedure for executada com sucesso, a variável ´AAA´ retornará ´-999´, que é o valor em que foi inicializada.
Já tentei de várias maneiras retornar ao Delphi os códigos numéricos de erros de exceções geradas pelo FB, mas não obtive sucesso em nada. A camada do driver de acesso ao BD, seja OLEDB ou ODBC, não passa para cima estes códigos de retorno. Já as mensagens de excessões, sim.
Qualquer dúvida posta de novo aí!
SET TERM ^ ; CREATE PROCEDURE NEW_PROCEDURE RETURNS ( AAA INTEGER) AS begin AAA = -999; insert into logs (logs.transac_id, logs.transac_dthr, logs.hw_serie) values (111,´2000/05/05 10:10:10´, ´abd111´); when sqlcode -803 do exception axaxax; when any do aaa = -99; end ^ SET TERM ; ^ GRANT INSERT ON LOGS TO PROCEDURE NEW_PROCEDURE; GRANT EXECUTE ON PROCEDURE NEW_PROCEDURE TO SYSDBA;
Em meu código na verdade tem mais coisas, mas aqui é só pra exemplificar.
Em minha tabela LOGS, eu preciso saber se já existe um outro registro igual ao que estou inserindo. Para isso existem campos únicos na tabela (indicados no código), em que ao inserir outro registro com estes códigos iguais aos de outro registro, então o BD gera um Exception. No caso de registro duplicado, a variável SQLCODE, interna do Firebid, é carregada com valor -803, que entra no tratamento de exceções do ´when´, retornado ao programa o valor textual do Exception que chamei de MY_EXCEPTION_1. Para qualquer outro erro que ocorrer, será retornado o valor do Exception MY_EXCEPTION_2.
Para chamar esta Stored Procedure de seu código no Delhi, faça assim:
with ADOQuery do begin Close; SQL.Clear; sql.Add(´EXECUTE PROCEDURE NEW_PROCEDURE´); open; end;
Para ver o conteúdo da variável de saída da procedure, variável que chamei de ´AAA´, faça assim:
showmessage(ADOQuery .fieldbyname(´aaa´).AsString);
OBS.: Se ocorrer um erro qualquer na execução desta stored procedure, que chamei de ´NEW_PROCEDURE´, então a variável ´AAA´ retornará NULL. Se a procedure for executada com sucesso, a variável ´AAA´ retornará ´-999´, que é o valor em que foi inicializada.
Já tentei de várias maneiras retornar ao Delphi os códigos numéricos de erros de exceções geradas pelo FB, mas não obtive sucesso em nada. A camada do driver de acesso ao BD, seja OLEDB ou ODBC, não passa para cima estes códigos de retorno. Já as mensagens de excessões, sim.
Qualquer dúvida posta de novo aí!
GOSTEI 0
Rtava
23/10/2004
Sistemp, apenas completando o que disse a respeito da impossibilidade da captura dos códigos numéricos de erro, dê uma olha neste tópico que nele é indicado como fazer.
http://forum.clubedelphi.net/viewtopic.php?t=73629
http://forum.clubedelphi.net/viewtopic.php?t=73629
GOSTEI 0
Adrinei
23/10/2004
Afarias,
Tentei tratar o erro -803 (duplicação de chave) em um trigger mas não funcionou, mesmo estando em BEFORE.
Porque a cláusula WHEN SQLCODE -803 DO ... não é captada no trigger?
Se utilizo em procedure, logo após o comando insert, funciona!
Mas o trigger before insert não se encaixa na mesma situação?
Tentei tratar o erro -803 (duplicação de chave) em um trigger mas não funcionou, mesmo estando em BEFORE.
Porque a cláusula WHEN SQLCODE -803 DO ... não é captada no trigger?
Se utilizo em procedure, logo após o comando insert, funciona!
Mas o trigger before insert não se encaixa na mesma situação?
GOSTEI 0