Fabiano

 

Outra saída é você criar uma package onde na trigger after each row você
guarda o rowid ou pk das linhas que foram atualizadas, então você cria uma
trigger stantement

e descarrega essa packager (vetor) atualizando o que você precisa.

 

 

Algo assim....

 

create or replace package PK_ATUALIZA_EX_DOCUMENTO is
  TYPE vtProcesso IS TABLE OF EX_DOCUMENTO_ITEM.PROCESSO_ID%TYPE    ----- pk
da tabela
    INDEX BY BINARY_INTEGER;
  vnProcesso vtProcesso;
  vnProcesso_null vtProcesso;
  viIndice BINARY_INTEGER := 0;
end PK_ATUALIZA_EX_DOCUMENTO;



CREATE OR REPLACE TRIGGER  TG_AIUD_EX_DOCUMENTO
  after insert or update or delete on EX_DOCUMENTO
  for each row

declare
begin
  PK_ATUALIZA_EX_DOCUMENTO.viIndice := PK_ATUALIZA_EX_DOCUMENTO.viIndice +
1;
  IF INSERTING OR UPDATING THEN
    PK_ATUALIZA_EX_DOCUMENTO.vnProcesso(PK_ATUALIZA_EX_DOCUMENTO.viIndice)
:= :NEW.PROCESSO_ID;
  ELSE
    PK_ATUALIZA_EX_DOCUMENTO.vnProcesso(PK_ATUALIZA_EX_DOCUMENTO.viIndice)
:= :OLD.PROCESSO_ID;
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    PK_ATUALIZA_EX_DOCUMENTO.viIndice := 0;
    PK_ATUALIZA_EX_DOCUMENTO.vnProcesso :=
PK_ATUALIZA_EX_DOCUMENTO.vnProcesso_null;
    RAISE_APPLICATION_ERROR (-20200, SQLERRM );
end TG_AIUD_EX_DOCUMENTO;



CREATE OR REPLACE TRIGGER TG_AIUD_EX_DOCUMENTO_S
  after insert or update or delete on EX_DOCUMENTO

declare
begin
  FOR viIndice IN 1.. PK_ATUALIZA_EX_DOCUMENTO.viIndice LOOP

     SELECT * FROM EX_DOCUMENTO_ITEM WHERE EX_DOCUMENTO_ITEM.PROCESSO_ID =
PK_ATUALIZA_EX_DOCUMENTO.vnProcesso(viIndice);

     ------ fazer as atualizaçoes necessarias
  END LOOP;


  PK_ATUALIZA_EX_DOCUMENTO.viIndice := 0;
  PK_ATUALIZA_EX_DOCUMENTO.vnProcesso :=
PK_ATUALIZA_EX_DOCUMENTO.vnProcesso_null;
EXCEPTION
  WHEN OTHERS THEN
    PK_ATUALIZA_EX_DOCUMENTO.viIndice := 0;
    PK_ATUALIZA_EX_DOCUMENTO.vnProcesso :=
PK_ATUALIZA_EX_DOCUMENTO.vnProcesso_null;
    RAISE_APPLICATION_ERROR (-20200, SQLERRM );
end TG_AIUD_EX_DOCUMENTO_S;



 

Espero ter ajudado

 

 

  _____  

De: [email protected] [mailto:[EMAIL PROTECTED] Em
nome de Fabiano Arndt
Enviada em: quinta-feira, 15 de setembro de 2005 11:24
Para: [email protected]
Assunto: Re: [oracle_br] Trigger mutante

 

Olá Alex,

valeu pela dica aí,
bom dessa package eu já ouvi falar, mas nunca usei ela pra algo
prático, pelo pouco que eu sei ela é usada para agendar algumas
execuções, e tal,

mais ou menos entendi sua idéia, me corrija se estiver errado,
seria algo assim: na trigger ao invés de excutar o update eu
executaria um job para rodar daqui alguns segundos. aí esse job
executaria os comandos de updates nos outros registros que precisam
ser atualizados, aí esse job seria excutado no contexto de uma outra
transação e não haveria aquele erro. isso?

não sei se estou viajando na maionese.

se a idéia for essa mesma, como eu deveria fazer a chamada ao DBMS_JOB
dentro da trigger, se pudessem me dar um exemplo ficaria 100%.

valeu,
Fabiano. 

Em 14/09/05, Alex Fernando Kirsten<[EMAIL PROTECTED]> escreveu:
>  Olá Fabiano
>  A solução é usar um job. Dispare um job com DBMS_JOB. De uma olhada sobre
> essa package no metalink q la tem as funções explicadas.
>  []'s
> --
> Alex Fernando Kirsten
> Oracle DBA
> Oracle Certified Associate
> MSN: [EMAIL PROTECTED]
> Email: [EMAIL PROTECTED]
>  On 9/14/05, Fabiano Arndt <[EMAIL PROTECTED]> wrote:
> >
> > Olá pessoal,
> >
> > seguinte, tenho uma trigger que é ligada a uma tabela de produtos,
> > essa trigger quando é disparada deve alterar (apenas alguns poucos
> > casos) um outro resgistro na mesma tabela, aí fui eu lá fazer a
> > trigger que está ai embaixo, quando estava todo feliz da vida achando
> > que isso era algo simples fui testar e me aparece a mensagem dizendo
> > que a trigger é mutante e tal.....
> >
> > me lembro que a um bom tempo atrás, alguém postou uma duvida parecida
> > com essa, e alguém deu uma solução, gostaria de saber se alguém
> > poderia me dar uma luz nesse caso, não gostaria de ter que fazer isso
> > no programa, pois existem varios lugare que teria alterar.
> >
> > valeu,
> > Fabiano.
> >
> >
> > CREATE OR REPLACE TRIGGER TRG_PRODUTO_A
> > AFTER UPDATE ON TB_PRODUTO
> > FOR EACH ROW
> > DECLARE
> > vIndice NUMBER;
> > BEGIN
> > IF UPDATING('VAL_VAREJO') THEN --quando for feita uma alteração no
> > preco de varejo
> > vIndice := :NEW.VAL_VAREJO / :NEW.NUM_EMBALAGEM;
> > update Tb_Produto set Val_Varejo = vIndice * NUM_EMBALAGEM where
> > Cod_produto IN
> > (Select Cod_Produto_Preco From Tb_Produto_Precos Where
> > Cod_Produto = :New.Cod_Produto);
> >
> > END IF;
> > END;
> >
> >
> >


______________________________________________________________________

Histórico: http://www.mail-archive.com/[email protected]/
Falar com os Moderadores:([EMAIL PROTECTED])
Dorian Anderson Soutto - Fernanda Damous - Alisson Aguiar 
______________________________________________________________________ 





Yahoo! Grupos, um serviço oferecido por:



PUBLICIDADE
 
<http://br.rd.yahoo.com/SIG=12f55ic9p/M=365837.7000707.7924794.2369893/D=brc
lubs/S=2137114689:HM/Y=BR/EXP=1126801463/A=2950750/R=2/id=noscript/SIG=10tif
t5qr/*http:/br.movies.yahoo.com/> 

 
<http://br.i1.yimg.com/br.yimg.com/i/br/ads6/0829_lrec_cinema_calendario.gif
> 

 

  _____  

Links do Yahoo! Grupos

*       Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/
  
*       Para sair deste grupo, envie um e-mail para:
[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]> 
  
*       O uso que você faz do Yahoo! Grupos está sujeito aos Termos do
Serviço do <http://br.yahoo.com/info/utos.html>  Yahoo!. 



[As partes desta mensagem que não continham texto foram removidas]



______________________________________________________________________

Histórico: http://www.mail-archive.com/[email protected]/
Falar com os Moderadores:([EMAIL PROTECTED])
Dorian Anderson Soutto - Fernanda Damous - Alisson Aguiar 
______________________________________________________________________ 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 


Responder a