Number of recursive SQL levels oracle

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
HenriqueMachado
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Seg, 29 Mai 2006 1:24 pm
Localização: Blumenau - SC
Abraços,
Henrique Machado Muller

olá gente, estou com o seguinte problema.

Quando vou dar um update em uma tabela dá o erro: number of recursive SQL levels oracle.

Bom, já descrobi o porque, trigger que estão sendo chamadas recursiva.

Queria saber se tem como fazer algo assim

Só executa a trigger se o numero da chamada recursiva por 1. Ou algo parecido.
alguém conhece?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Acredito que você pode declarar uma variável numa package spec, inicializar com ZERO.
Ai cada vez que você inicia a trigger, você SOMA 1 nessa variável.

Então basta colocar um IF dentro da trigger. Se essa variável for 1, executa o que você precisa executar. (pois vai ser a primeira vez).

Se for <> 1 não faz nada.
No fim a trigger, diminui 1 dessa variável. (pra voltar a ser zero).

Como ele vai disparar denovo, ele vai somar 1 e a variável vai ser 2. Ou seja, na segunda vez, não vai executar.
OU seja, ele não vai chamar recursivamente a sua trigger.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP


Boa tarde brothers, quanto tempo...
Voltando aos poucos mais uma vez...

Aqui na empresa onde estou atualmente, utilizamos exatamente o conceito que o Dr_Gori comentou.


Quando vou dar insert, caso não queria que a trigger dispare, por exemplo, seto uma global em PL/SQL, através de uma package, mais ou menos assim:

Selecionar tudo


begin
  util.set('N');
  -- Insere na tabela
  insert into tabela (cod, nome) values (1,'Trevisolli');
end;
E no trigger você pode fazer essa validação:

Selecionar tudo

if util.get = 'S' then
  -- realiza os procedimentos do trigger
  insert into tabela_hist (data,cod,nome) values (sysdate,:new.cod, :new.nome);
end if;
Uma outra saída (não sei se tão prática quanto esta), seria, quando for um determinado USER, não disparar o trigger, utilizando-se da cláusula WHEN do trigger.

Mas, a idéia do nosso grande amigo (Dr_Gori) é muito bacana e, é a que utilizamos hoje.

Grande abraço,

Trevisolli
Responder
  • Informação