Erro ORA-06512 e ORA-04088

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
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

Pessoal bom dia estou passando por alguns problemas para fazer algumas deleções no banco onde tenho triggers que são disparadas na hora das deleções.Eu tenho uma tabela chamada WMS_RELMTGVOLORDSVC e tem uma trigger que dispara antes da deleção da tebela, so que ta me gerando dois erros.

Selecionar tudo

ORA-06512: em "SA01PTRINV.DEL_WMS_RELMTGVOLORDSVC", line 17
ORA-04088: erro durante a execução do gatilho 'SA01PTRINV.DEL_WMS_RELMTGVOLORDSVC'
a linha 17 é o

Selecionar tudo

THEN   //// Linha 17
-- teoricamente esta tudo correto

trigger

Selecionar tudo

DROP TRIGGER SA01PTRINV.DEL_WMS_RELMTGVOLORDSVC;

CREATE OR REPLACE TRIGGER SA01PTRINV.del_wms_relmtgvolordsvc
   BEFORE DELETE
   ON SA01PTRINV.WMS_RELMTGVOLORDSVC    REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
DECLARE
   sztraceproc   VARCHAR2 (50);
   szsqlmens     VARCHAR2 (500);
BEGIN
   sztraceproc := 'DEL_WMS_MTGVOL';

   DELETE FROM wms_relmtgordmovesq
         WHERE idcmtgvolordsvc = :OLD.idcmtgvolordsvc;
EXCEPTION
   WHEN OTHERS
   THEN   //// Linha 17
      szsqlmens :=
            'TRG EXCLUSÃO DA MONTAGEM DE VOLUME: '
         || sztraceproc
         || ': '
         || SQLERRM;
      raise_application_error (-20110, szsqlmens);
END del_wms_relmtgvolordsvc;
/
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Douglas,
Existem alguns problemas no que está fazendo.
ORA-06512 é apenas um indicativo da linha do erro.
LINHA não é o que você está vendo mas sim no que está gravado na tabela. Sua IDE de desenvolvimento pode alterar visualmente as linhas (um autoident customizado por exemplo).
Mas vamos aos erros em si:

Trigger não pode levantar nenhuma exceção. Ou executa tudo direitinho ou dá erro, não tem meio termo.
raise_application_error obriga ao banco fazer um coito interrompido, hehehe e ele vai da erro sempre.
Então ou você trata a exceção ou sempre vai dar erro.
Evite TRIGGER o máximo que puder.

Pelo que notei, sua trigger faz o "on delete cascade". Se for o caso de deletar alguma informação de uma tabela, e deletar todos dados de outra tabela que possui esse id, basta criar as chaves primarias e estrangeiras corretamente, e colocar a opção "on delete cascade".
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

Noctifero, tire uma duvida minha por favor se eu tenho 4 tabelas ex: a 1 é filha da 2 que é filha da 3 que é filha da 4, isso em relacionamento criando o delete cascade vai ter que ser nas 3 que tem filhas ou colocando apenas na mãe de todas
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Depende de como está suas chaves.
O "on delete cascade" tem que ser na chave estrangeira. Ou seja, você tem que construir as chaves obedecendo a hierarquia e verificando se não vai ferir qualquer tabela envolvida.
Desconsiderando outras tabelas, todas filhas que possuem FK para seus pais teriam que ter o "cascade", para quando deletar algum pai, a filha ser deletada.
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

ok obrigado
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Tenho uma consideração extra a ser feita.

olhando seu código

Selecionar tudo

CREATE OR REPLACE TRIGGER SA01PTRINV.del_wms_relmtgvolordsvc
BEFORE DELETE
ON SA01PTRINV.WMS_RELMTGVOLORDSVC REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
sztraceproc VARCHAR2 (50);
szsqlmens VARCHAR2 (500);
BEGIN
sztraceproc := 'DEL_WMS_MTGVOL';

DELETE FROM wms_relmtgordmovesq
WHERE idcmtgvolordsvc = :OLD.idcmtgvolordsvc;
EXCEPTION
WHEN OTHERS
THEN //// Linha 17
szsqlmens :=
'TRG EXCLUSÃO DA MONTAGEM DE VOLUME: '
|| sztraceproc
|| ': '
|| SQLERRM;
raise_application_error (-20110, szsqlmens);
END del_wms_relmtgvolordsvc;
Eu observeri que a variavel szsqlmens só tem 500 posições. Seu erro pode estar ai, porque muitas vezes, na verdade na maioria, o SQLERRM retorna mais de 500 caracteres.
Eu reescreveria o raise para algo assim:

Selecionar tudo

raise_application_error (-20110, 'TRG EXCLUSÃO DA MONTAGEM DE VOLUME: '
|| sztraceproc
|| ': '
|| SQLERRM);
Desta forma, indiferente ao tamanho do stacktrace ele sempre retornara o mais completo possivel.
No mais não vejo outra possibilidade de erro.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Realmente, não tinha notado essa variável.
Porém ela não influencia na resolução do erro na trigger. Ao lançar uma exceção(raise...), já invalida a alteração da trigger. Teria que tratar a exceção sem o "raise".
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

Valeu pela dica funcionou aqui Noctifero
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes