Junior,

o
que houve foi que no trigger for statement, você colocou
pkg_caixa.v_contador no índice do vetor quando deveria colocar a
variável v_ind do Loop. Comentei a parte do seu código e coloquei a
minha abaixo. Veja agora, Alexsandro.

--------------------------
--      VETOR
--------------------------

PACKAGE pkg_caixa IS
   TYPE caixa IS RECORD (
      cd_empres                     fccaixa.cd_empres%TYPE
     ,nr_lancxa                     fccaixa.nr_lancxa%TYPE
     ,nr_anocxa                     fccaixa.nr_anocxa%TYPE
   );

   TYPE t_caixa IS TABLE OF caixa
      INDEX BY BINARY_INTEGER;

   v_caixa                       t_caixa;
   v_contador                    BINARY_INTEGER := 0;
END;
----------------------------------------------------------------
-- TRIGGER PASSA VALORES PARA VETOR
----------------------------------------------------------------
CREATE OR REPLACE TRIGGER tr_atuctb_cx
   AFTER DELETE OR UPDATE
   ON fccaixa
   REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
DECLARE
   dvalor                        NUMBER (14, 2);
   irow                          NUMBER (10);
BEGIN
-->
   IF :OLD.cd_lancam IS NOT NULL THEN
-->
      pkg_caixa.v_contador       := pkg_caixa.v_contador + 1;
      pkg_caixa.v_caixa (pkg_caixa.v_contador).cd_empres := :OLD.cd_empres;
      pkg_caixa.v_caixa (pkg_caixa.v_contador).nr_lancxa := :OLD.nr_lancxa;
      pkg_caixa.v_caixa (pkg_caixa.v_contador).nr_anocxa := :OLD.nr_anocxa;
   END IF;
END;
--------------------------------------------------------------------
-- TRIGGER GRAVA NA TABELA DA TRIGGER
--------------------------------------------------------------------
CREATE OR REPLACE TRIGGER tr_limcam_cxa
   AFTER DELETE OR UPDATE OF nr_lancxa, cd_empres, nr_anocxa
   ON fccaixa
   REFERENCING NEW AS NEW OLD AS OLD
DECLARE
   v_count                       NUMBER (7);
BEGIN
   FOR v_ind IN 1 .. pkg_caixa.v_contador LOOP
      UPDATE fccaixa
         SET cd_lancam = NULL
            ,cd_lote = NULL
            ,nr_anolot = NULL
       WHERE cd_empres = pkg_caixa.v_caixa (v_ind).cd_empres

         AND nr_lancxa = pkg_caixa.v_caixa (v_ind).nr_lancxa

         AND nr_anocxa = pkg_caixa.v_caixa (v_ind).nr_anocxa;


--       WHERE cd_empres = pkg_caixa.v_caixa (pkg_caixa.v_contador).cd_empres
--         AND nr_lancxa = pkg_caixa.v_caixa (pkg_caixa.v_contador).nr_lancxa
--         AND nr_anocxa = pkg_caixa.v_caixa (pkg_caixa.v_contador).nr_anocxa;
   END LOOP;

-->
   pkg_caixa.v_contador       := 0;
END;


----- Mensagem original ----
De: Junior <[EMAIL PROTECTED]>
Para: [EMAIL PROTECTED]
Enviadas: Quinta-feira, 17 de Maio de 2007 9:15:04
Assunto: Re: [oracle_br] Tabela Mutante !



 

Bom Dia AlexSandro !

 

 

Cara ... eu segui as tuas dicas e a principio 
eu estou conseguindo gravar no vetor ...

Criei uma trigger do tipo EACH ROW, e 
uma outra do tipo STATMENT, para

ler o vetor e gravar...

Só que a trigger do tipo EACH ROW  esta executando certo, porém a do 
tipo

STATMENT, não executa.... Tu sabe me dizer se tem alguma conflito, 
algo

de errado, ou se falta algo ....

 

Segue a trigger's:

 

Desde já Agradeço!

 

--------------------------

      VETOR

--------------------------

PACKAGE PKG_CAIXA 
IS 


TYPE CAIXA IS 
RECORD 

(CD_EMPRES FCCAIXA.CD_EMPRES %type

,NR_LANCXA FCCAIXA.NR_LANCXA %type

,NR_ANOCXA FCCAIXA.NR_ANOCXA %type);

TYPE t_CAIXA IS 
TABLE OF CAIXA

INDEX BY BINARY_INTEGER; 

V_CAIXA T_CAIXA;

V_CONTADOR BINARY_INTEGER 
:= 0;

END; 


----------------------------------------------------------------

TRIGGER PASSA VALORES PARA VETOR

----------------------------------------------------------------


CREATE OR REPLACE TRIGGER tr_atuctb_cx

AFTER

DELETE OR UPDATE

ON fccaixa

REFERENCING NEW AS NEW OLD AS OLD

FOR EACH ROW

DECLARE

dValor Number(14,2);

iRow Number(10);

BEGIN

-->

If :Old.CD_LANCAM 
Is Not Null Then

-->

PKG_CAIXA.v_contador := 
PKG_CAIXA.v_contador + 1;

PKG_CAIXA.V_CAIXA(PKG_CAIXA.V_CONTADOR).CD_EMPRES := :Old.CD_EMPRES;

PKG_CAIXA.V_CAIXA(PKG_CAIXA.V_CONTADOR).NR_LANCXA := :Old.NR_LANCXA;

PKG_CAIXA.V_CAIXA(PKG_CAIXA.V_CONTADOR).NR_ANOCXA := :Old.NR_ANOCXA;



End If;

END;


 

--------------------------------------------------------------------

TRIGGER GRAVA NA TABELA DA TRIGGER

--------------------------------------------------------------------


CREATE OR REPLACE TRIGGER tr_limcam_cxa

AFTER

DELETE OR UPDATE OF nr_lancxa, cd_empres, nr_anocxa

ON fccaixa

REFERENCING NEW AS NEW OLD AS OLD

DECLARE 

v_count number(7); 


BEGIN 

FOR v_ind IN 
1..PKG_CAIXA.v_contador LOOP

    Update FCCAIXA Set CD_LANCAM = Null, CD_LOTE = Null, NR_ANOLOT = 
Null

    Where CD_EMPRES = PKG_CAIXA.V_CAIXA(PKG_CAIXA.v_contador).CD_EMPRES

    And NR_LANCXA = PKG_CAIXA.V_CAIXA(PKG_CAIXA.v_contador).NR_LANCXA

    And NR_ANOCXA = PKG_CAIXA.V_CAIXA(PKG_CAIXA.v_contador).NR_ANOCXA;

END LOOP;

-->

PKG_CAIXA.V_CONTADOR := 
0;

END;


 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 


  ----- Original Message ----- 

  From: 
  Alexsandro Pereira 

  To: oracle_br@yahoogrupos.com.br 
  

  Sent: Wednesday, May 16, 2007 6:05 
  PM

  Subject: Res: [oracle_br] Tabela Mutante 
  !

  


  
  
  
  Amigo,

na realidade, você não vai conseguir executar a operação 
  desejada. O que fazemos é guardar em um array a identificação do registro 
para 
  ser processada depois. Num trigger for each row, populo o array e num trigger 
  after statement leio o array e faço as atualizações. As alterações podem ser 
  feitas no segundo trigger. Eu cortei boa parte do texto dos triggers mas acho 
  que dá para você ter uma idéia.

Att,
Alexsandro 
  Pereira.

----- Mensagem original ----
De: nunodetorres <jr_consystec@ terra.com. br>
Para: 
  [EMAIL PROTECTED] os.com.br
Enviadas: 
  Quarta-feira, 16 de Maio de 2007 17:15:25
Assunto: [oracle_br] Tabela 
  Mutante !

Boa Tarde Pessoal!

Tenho um trigger onde estou 
  atualizando um registro na mesma tabela da 

trigger, e esta exibindo a 
  seguinte mensagem de erro. 

ORA-20000: -4091 (PR_DOCUMENTOS_ 002) 
  ORA-04091: a tabela 

SAUDEAD600.DOCUMENT OS é mutante; talvez o 
  gatilho/função não possa 

localizá-la

Porém, na procedure foi 
  declarado o comando PRAGMA 

AUTONOMOUS_TRANSACT ION. 

Preciso de 
  mais alguma coisa para poder executar essa procedure sem 

erros? ou se 
  tiverem alguma outra sugestão será bem vinda?

Abraço a todos! 
  

<!--

#ygrp-mlmsg 
  {font-size:13px; font-family: arial, helvetica, clean, 
  sans-serif;}
#ygrp-mlmsg table 
  {font-size:inherit; font:100% ;}
#ygrp-mlmsg select, input, 
  textarea {font:99% arial, helvetica, clean, sans-serif;}
#ygrp-mlmsg pre, 
  code {font:115% monospace;}
#ygrp-mlmsg * 
  {line-height: 1.22em;}
#ygrp-text{
font-family: Georgia;
}
#ygrp-text 
  p{
margin:0 0 1em 
  0;}
#ygrp-tpmsgs{
font-family: Arial;
clear:both;}
#ygrp-vitnav{
padding-top: 10px;font- family:Verdana; font-size: 77%;margin: 0;}
#ygrp-vitnav 
  a{
padding:0 1px;}
#ygrp-actbar{
clear:both;margin: 25px 
  0;white-space: nowrap;color: #666;text- align:right; }
#ygrp-actbar 
  .left{
float:left;white- space:nowrap; }
.bld{font-weight: bold;}
#ygrp-grft{
font-family: Verdana;font- size:77%; padding:15px 
  0;}
#ygrp-ft{
font-family: verdana;font- size:77%; border-top: 1px 
  solid #666;
padding:5px 0;
}
#ygrp-mlmsg 
  #logo{
padding-bottom: 10px;}

#ygrp-vital{
background-color: #e0ecee;margin- bottom:20px; padding:2px 
  0 8px 8px;}
#ygrp-vital 
  #vithd{
font-size:77% ;font-family: Verdana;font- weight:bold; color:#333; 
text-transform: uppercase; }
#ygrp-vital 
  ul{
padding:0;margin: 2px 0;}
#ygrp-vital ul 
  li{
list-style-type: none;clear: both;border: 1px solid 
  #e0ecee;
}
#ygrp-vital ul li 
  .ct{
font-weight: bold;color: #ff7900;float: right;width: 2em;text- align:right; 
padding-right: .5em;}
#ygrp-vital 
  ul li .cat{
font-weight: bold;}
#ygrp-vital a 
  {
text-decoration: none;}

#ygrp-vital 
  a:hover{
text-decoration: underline; }

#ygrp-sponsor 
  #hd{
color:#999;font- size:77%; }
#ygrp-sponsor 
  #ov{
padding:6px 
  13px;background- color:#e0ecee; margin-bottom: 20px;}
#ygrp-sponsor 
  #ov ul{
padding:0 0 0 8px;margin:0; }
#ygrp-sponsor #ov 
  li{
list-style-type: square;padding: 6px 
  0;font-size: 77%;}
#ygrp-sponsor #ov li 
  a{
text-decoration: none;font- size:130% ;}
#ygrp-sponsor 
  #nc {
background-color: #eee;margin- bottom:20px; padding:0 
  8px;}
#ygrp-sponsor .ad{
padding:8px 0;}
#ygrp-sponsor .ad 
  #hd1{
font-family: Arial;font- weight:bold; color:#628c2a; font-size: 100%;line- 
height:122% ;}
#ygrp-sponsor 
  .ad a{
text-decoration: none;}
#ygrp-sponsor .ad 
  a:hover{
text-decoration: underline; }
#ygrp-sponsor .ad 
  p{
margin:0;}
o {font-size:0; }
.MsoNormal {
margin:0 0 0 
  0;}
#ygrp-text tt{
font-size:120% ;}
blockquote{margin: 0 0 0 
  4px;}
.replbq 
  {margin:4;}
-->

____________ _________ _________ _________ _________ __
Fale 
  com seus amigos de graça com o novo Yahoo! Messenger 
http://br.messenger .yahoo.com/ 
  
----------

CREATE OR REPLACE PACKAGE K_MNT_OFA IS 

-- Autor: 
  Erick Pacheco 
-- Data : 04/02/2000 
-- Finalidade: Gerar variáveis de 
  trabalho para os triggers 
-- TG_OFA_01 e TG_OFA_02. 

TYPE oficina 
  IS RECORD 
(cd_material v_material_impl. cd_material %type 
  
,cd_material_ nha v_material_impl. cd_material %type 
  
,cd_unidade_ apoiada v_unidades_aer_ brasil.cd_ unidade %type 
  
,cd_oficina_ apoio t_oficina_apoio. cd_oficina_ apoio %type); 
  

TYPE t_oficina IS TABLE OF oficina 
INDEX BY BINARY_INTEGER; 
  

v_oficina t_oficina; 
v_contador BINARY_INTEGER := 0; 
END; 
  
/ 

----------

CREATE OR REPLACE TRIGGER TG_OFA_01 
BEFORE 
  INSERT OR UPDATE 
OF IN_GERENTE, CD_MATERIAL_ NHA, CD_UNIDADE_APOIO, 
  CD_UNIDADE_SETOR 
ON T_OFICINA_APOIO 
FOR EACH ROW 

DECLARE 
  
v_in_conj_comp varchar2(1); 

BEGIN 
  
------------ --------- --------- --------- --------- --------- - 
  
--- PROGRAMA : TG_OFA_01.TXT --- 
--- DATA : 04/02/2000 --- 
  
------------ --------- --------- --------- --------- --------- - 
  
if :new.cd_material is not null and 
:new.cd_material_ nha is not 
  null and 
:new.cd_unidade_ apoiada is not null then 
  

K_MNT_OFA.v_ contador := K_MNT_OFA.v_ contador + 1; 

if 
  INSERTING or UPDATING then 
  

K_MNT_OFA.v_ oficina(K_ MNT_OFA.v_ contador) .cd_material 
  
:= :new.cd_material; 
  

K_MNT_OFA.v_ oficina(K_ MNT_OFA.v_ contador) .cd_material_ nha 
  
:= :new.cd_material_ nha; 
  

K_MNT_OFA.v_ oficina(K_ MNT_OFA.v_ contador) .cd_unidade_ apoiada 
  
:= :new.cd_unidade_ apoiada; 
  

K_MNT_OFA.v_ oficina(K_ MNT_OFA.v_ contador) .cd_oficina_ apoio 
  
:= :new.cd_oficina_ apoio; 
end if; 
end if; 
  

----------** ********- --------- ********* *-------- --******* ***------ ---- 
  
END; 
/ 

----------

CREATE OR REPLACE TRIGGER TG_OFA_02 
  
AFTER INSERT OR UPDATE 
OF CD_MATERIAL, CD_MATERIAL_ NHA, 
  CD_UNIDADE_APOIADA 
ON T_OFICINA_APOIO 

DECLARE 
v_count 
  number(7); 

BEGIN 
  
------------ --------- --------- --------- --------- --------- - 
  
--- PROGRAMA : TG_OFA_02.TXT --- 
--- DATA : 04/02/2000 --- 
--- 
  DEFINICAO : ALEXSANDRO SOARES --- 
--- CONSTRUCAO: ERICK PACHECO --- 
  
--- DESCRICAO : loop para correr através do array dos --- 
--- 
  registros manipulados --- 
  
------------ --------- --------- --------- --------- --------- - 
  
------------ --------- MANUTENCOES- --------- --------- --------- 
  
--- DATA : --- 
--- SOLICITACAO: --- 
--- CONSTRUCAO : --- 
--- 
  DESCRICAO : --- 
  
------------ --------- --------- --------- --------- --------- - 
  

FOR v_ind IN 1..K_MNT_OFA. v_contador 
LOOP 
select count(1) 
  
into v_count 
from t_oficina_apoio ofa 
where 
  ofa.cd_oficina_ apoio <> 
  
K_MNT_OFA.v_ oficina(K_ MNT_OFA.v_ contador) .cd_oficina_ apoio 
  
and ofa.cd_material = 
  
K_MNT_OFA.v_ oficina(K_ MNT_OFA.v_ contador) .cd_material 
  
and ofa.cd_material_ nha = 
  
K_MNT_OFA.v_ oficina(K_ MNT_OFA.v_ contador) .cd_material_ nha 
  
and ofa.cd_unidade_ apoio = 
  
K_MNT_OFA.v_ oficina(K_ MNT_OFA.v_ contador) .cd_unidade_ apoiada 
  
and ofa.in_gerente = 'S'; 

if v_count > 1 then 
  
raise_application_ error 
(-2000 
,'Transação cancelada: Existe 
  mais de uma Unidade '|| 
'gerenciando o mesmo material usado no mesmo '|| 
  
'PN NHA dentro da mesma Unidade Operadora.') ; 
end if; 
  
----------** ********- --------- ********* *-------- --******* ***------ ---- 
  
END LOOP; 
K_MNT_OFA.v_ contador := 0; 
END; 
/ 

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



 
  #ygrp-mlmsg {
FONT-SIZE:small;FONT-FAMILY:arial, helvetica, clean, sans-serif;}
#ygrp-mlmsg TABLE {

}
#ygrp-mlmsg SELECT {
FONT:99% arial, helvetica, clean, sans-serif;}
INPUT {
FONT:99% arial, helvetica, clean, sans-serif;}
TEXTAREA {
FONT:99% arial, helvetica, clean, sans-serif;}
#ygrp-mlmsg PRE {
FONT:100% monospace;}
CODE {
FONT:100% monospace;}
#ygrp-mlmsg  {
LINE-HEIGHT:1.22em;}
#ygrp-text {
FONT-FAMILY:Georgia;}
#ygrp-text P {
MARGIN:0px 0px 1em;}
#ygrp-tpmsgs {
CLEAR:both;FONT-FAMILY:Arial;}
#ygrp-vitnav {
FONT-SIZE:77%;MARGIN:0px;PADDING-TOP:10px;FONT-FAMILY:Verdana;}
#ygrp-vitnav A {
PADDING-RIGHT:1px;PADDING-LEFT:1px;PADDING-BOTTOM:0px;PADDING-TOP:0px;}
#ygrp-actbar {
CLEAR:both;MARGIN:25px 0px;COLOR:#666;WHITE-SPACE:nowrap;TEXT-ALIGN:right;}
#ygrp-actbar .left {
FLOAT:left;WHITE-SPACE:nowrap;}
.bld {
FONT-WEIGHT:bold;}
#ygrp-grft {
PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:77%;PADDING-BOTTOM:15px;PADDING-TOP:15px;FONT-FAMILY:Verdana;}
#ygrp-ft {
PADDING-RIGHT:0px;BORDER-TOP:#666 1px 
solid;PADDING-LEFT:0px;FONT-SIZE:77%;PADDING-BOTTOM:5px;PADDING-TOP:5px;FONT-FAMILY:verdana;}
#ygrp-mlmsg #logo {
PADDING-BOTTOM:10px;}
#ygrp-vital {
PADDING-RIGHT:0px;PADDING-LEFT:8px;MARGIN-BOTTOM:20px;PADDING-BOTTOM:8px;PADDING-TOP:2px;BACKGROUND-COLOR:#e0ecee;}
#ygrp-vital #vithd {
FONT-WEIGHT:bold;FONT-SIZE:77%;TEXT-TRANSFORM:uppercase;COLOR:#333;FONT-FAMILY:Verdana;}
#ygrp-vital UL {
PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:2px 
0px;PADDING-TOP:0px;}
#ygrp-vital UL LI {
CLEAR:both;BORDER-RIGHT:#e0ecee 1px solid;BORDER-TOP:#e0ecee 1px 
solid;BORDER-LEFT:#e0ecee 1px solid;BORDER-BOTTOM:#e0ecee 1px 
solid;LIST-STYLE-TYPE:none;}
#ygrp-vital UL LI .ct {
PADDING-RIGHT:0.5em;FONT-WEIGHT:bold;FLOAT:right;WIDTH:2em;COLOR:#ff7900;TEXT-ALIGN:right;}
#ygrp-vital UL LI .cat {
FONT-WEIGHT:bold;}
#ygrp-vital A {
TEXT-DECORATION:none;}
#ygrp-vital A:hover {
TEXT-DECORATION:underline;}
#ygrp-sponsor #hd {
FONT-SIZE:77%;COLOR:#999;}
#ygrp-sponsor #ov {
PADDING-RIGHT:13px;PADDING-LEFT:13px;MARGIN-BOTTOM:20px;PADDING-BOTTOM:6px;PADDING-TOP:6px;BACKGROUND-COLOR:#e0ecee;}
#ygrp-sponsor #ov UL {
PADDING-RIGHT:0px;PADDING-LEFT:8px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;}
#ygrp-sponsor #ov LI {
PADDING-RIGHT:0px;PADDING-LEFT:0px;FONT-SIZE:77%;PADDING-BOTTOM:6px;PADDING-TOP:6px;LIST-STYLE-TYPE:square;}
#ygrp-sponsor #ov LI A {
FONT-SIZE:130%;TEXT-DECORATION:none;}
#ygrp-sponsor #nc {
PADDING-RIGHT:8px;PADDING-LEFT:8px;MARGIN-BOTTOM:20px;PADDING-BOTTOM:0px;PADDING-TOP:0px;BACKGROUND-COLOR:#eee;}
#ygrp-sponsor .ad {
PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:8px;PADDING-TOP:8px;}
#ygrp-sponsor .ad #hd1 {
FONT-WEIGHT:bold;FONT-SIZE:100%;COLOR:#628c2a;LINE-HEIGHT:122%;FONT-FAMILY:Arial;}
#ygrp-sponsor .ad A {
TEXT-DECORATION:none;}
#ygrp-sponsor .ad A:hover {
TEXT-DECORATION:underline;}
#ygrp-sponsor .ad P {
MARGIN:0px;}
o {
FONT-SIZE:0px;}
.MsoNormal {
MARGIN:0px;}
#ygrp-text TT {
FONT-SIZE:120%;}
BLOCKQUOTE {
MARGIN:0px 0px 0px 4px;}
.replbq {

}






__________________________________________________
Fale com seus amigos  de graça com o novo Yahoo! Messenger 
http://br.messenger.yahoo.com/ 

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

Responder a