Erro em Trigger

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
rafaelsantello
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sáb, 25 Jun 2011 11:45 am
Localização: Santo André-SP

Bom dia,
Dei uma pesquisada na web e também aqui no fórum, mas não achei claramente se há algum procedimento ou ação a ser feita para o caso que foi relatar agora.
É o seguinte, criei uma trigger, e em determinada situação que eu tratei, quero que retorne o erro que eu coloquei. Para isso, usei o raise_apllication_error, passando o código e a mensagem.
Entretanto, além de retornar esse erro criado, também retorna outros erros juntos, que são os seguintes:
ORA-06512: em NOME_TRIGGER, line...
ORA-04088: erro durante a execução do gatilho...

Tem algum comando para inibir a visualização dessas duas mensagens?

Muito obrigado!

Abraços
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

se puder postar o codigo da trigger fica mais fácil amigo...

de repente tu pode fazer

Selecionar tudo

exception
  when others then
    null;
end;
posta aí pra ver
rafaelsantello
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sáb, 25 Jun 2011 11:45 am
Localização: Santo André-SP

Oi Diego, beleza? Então... o código está abaixo.

A idéia é o seguinte... tem uma procedure que é chamada e faz um update na tabela WE alterando o stat para 95. Nesse instante, é disparada a trigger abaixo que chama uma outra procedure... o problema é que o sqlerrm fica carregado com a mensagem que está no ERRTEXT dentro do raise_aplication_error e também com as mensagens padrões do Oracle, e devolve para a procedure inicial o erro que foi tratado mais os erros do Oracle, e eu só precisava que fosse carregada com o que está no Errtext, sem mostrar os erros do Oracle.

Obrigado, abraço


CREATE OR REPLACE TRIGGER TRG_MAKE_ITF_WE
AFTER INSERT OR UPDATE ON WE
REFERENCING
NEW AS NEW
OLD AS OLD
FOR EACH ROW


Declare
errcode number := 0;
err_obj varchar2(255) := null;
errtext varchar2(255);
f_lager anwender.lager%type;


Begin

if (:old.stat <> '95' and :new.stat = '95') then




PKG_ITF_FISCAL.ITF_OUT_RECEBIMENTO(:NEW.LAGER,
:NEW.NR_WE,
:NEW.TYP_PROC,
:NEW.ID_PROC,
:NEW.ID_KLIENT,
:NEW.NR_LIEFERSCHEIN,
:NEW.DATUM_WE,
:NEW.TIME_AEN,
ERRCODE,
ERRTEXT);



if errcode != 0 then
err_obj := '@1Impossivel de confirmar Recebimento ' || :new.nr_we;

raise_application_error(-20005, ERRTEXT);
end if;

end if;

End;
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

O problema do RAISE_APPLICATION_ERROR é que ele retorna o erro tratado concatenado com a trigger e tudo o mais que aconteceu.

Selecionar tudo

ORA-20000: Teste erro
ORA-06512: at "OWNER.TRIGGER_NAME", line 9
ORA-04088: error during execution of trigger 'OWNER.TRIGGER_NAME'
Tenho duas soluções em mente:
1) Aqui no trabalho, temos uma package que insere os erros tratados numa PL/TABLE. No retorno do erro, ao invés de buscar por SQLERRM, retornamos um GET da package com todos os erros que aconteceram.

2) A outra solução é a forma XGH da coisa.
Tu pode fazer um SUBSTR buscando somente o teu erro :P
rafaelsantello
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sáb, 25 Jun 2011 11:45 am
Localização: Santo André-SP

Oi Diego,
A respeito do que você indicou, a primeira embora seja a mais correta, talvez fique um pouco fora para eu aplicar aqui, pois mudaria um pouco o conceito do funcionamento do sistema, onde teria que criar processos auxiliares para isso.
A respeito da segunda, também pensei no substr, porém as mensagens não têm tamanho fixo. Vou dar uma olhada se posso aplicar o substr mas com algum comando que faça com que ele procure o início e o término da mensagem, sem considerar os erros do Oracle. Caso souber de algo nesse sentido, peço por favor, me avisar.
O que é XGH ?? Olhei no google e alguns fóruns, é tipo uma gambiarra ou algo forçado? hehe....
De qualquer forma, muito obrigado pelas sugestões!

Abraço
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

vê isso ai, dbms_utility.format_call_stack

tem um outro lance de dbms_errlog, teria que vder o que fazem direito..
Responder
  • Informação