Fórum Como Enviar uma mensagem de Erro pela Store Procedure - INte #47667
23/10/2004
0
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
Curtir tópico
+ 0Posts
23/10/2004
Afarias
create exception nome_da_exception ´texto da exception´;
Capturando um erro dentro do procedimento::
{ comandos }
when do
;
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
08/02/2006
Rtava
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
16/02/2006
Rtava
http://forum.clubedelphi.net/viewtopic.php?t=73629
Gostei + 0
27/08/2007
Adrinei
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
Clique aqui para fazer login e interagir na Comunidade :)