GARANTIR DESCONTO

Fórum Como Enviar uma mensagem de Erro pela Store Procedure - INte #47667

23/10/2004

0

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.


Sistemp

Sistemp

Responder

Posts

23/10/2004

Afarias

Criando uma exceção::

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+


Responder

Gostei + 0

08/02/2006

Rtava

Sistemp, fiz a seguinte Stored Procedure para resolver este problema:

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í!


Responder

Gostei + 0

16/02/2006

Rtava

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


Responder

Gostei + 0

27/08/2007

Adrinei

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?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar