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]