Isso tem a ver com trigger e é um assunto meio chato, então vou tentar ser o
mais sucinto possível pra não ficar grande demais... rs

Existem 2 tipos de triggers: FOR EACH ROW e STATEMENT. Qdo é FOR EACH ROW,
vc tem que escrever literalmente o FOR EACH ROW na trigger, e qdo é trigger
STATEMENT, vc não põe nada na trigger. É como se o default fosse trigger
STATEMENT. Além disso, cada uma delas pode ser BEFORE ou AFTER. Suponha que
vc vai fazer um UPDATE que vai influenciar 3 registros em uma tabela, e essa
tabela possui triggers FOR EACH ROW BEFORE e AFTER, e STATEMENT BEFORE e
AFTER para UPDATE. É só para ilustrar quando cada uma é executada:

1) Execução da trigger STATEMENT BEFORE

   2) Execução da trigger FOR EACH ROW BEFORE
      3) Execução do UPDATE do primeiro registro na tabela
   4) Execução da trigger FOR EACH ROW AFTER

   2) Execução da trigger FOR EACH ROW BEFORE
      3) Execução do UPDATE do segundo registro na tabela
   4) Execução da trigger FOR EACH ROW AFTER

   2) Execução da trigger FOR EACH ROW BEFORE
      3) Execução do UPDATE do terceiro registro na tabela
   4) Execução da trigger FOR EACH ROW AFTER

5) Execução da trigger STATEMENT AFTER

Por esse exemplo acima dá pra visualizar legal as diferenças entre as
triggers FOR EACH ROW e STATEMENT: a FOR EACH ROW é executada para cada
linha que está sendo afetada pelo UPDATE, e a STATEMENT é executada apenas 1
vez para todo o comando. Além disso, tem outra grande diferença entre as 2:
na trigger FOR EACH ROW vc tem acesso ao registro que está sendo alterado
(através das variáveis :NEW e :OLD), enquanto na trigger STATEMENT vc não
tem.

Essas são as principais diferenças, mas tem outro detalhe que não fica tão
visível e que atrapalha um bocado: a situação da tabela mutante. Como vc
pode ver no exemplo acima, a trigger FOR EACH ROW é executada, por exemplo,
entre a execução do primeiro e do segundo UPDATE. Isso significa que durante
a execução dessa trigger a tabela onde está sendo feito o UPDATE não se
encontra consistente, já que o UPDATE todo ainda não terminou. Então, se vc
tentar fazer um SELECT que seja na própria tabela de dentro da trigger FOR
EACH ROW, o Oracle retornará um erro informando que a tabela é mutante. Isso
resulta na outra grande diferença entre as triggers: na trigger FOR EACH ROW
vc não tem acesso à própria tabela onde está a trigger, enquanto na trigger
STATEMENT, vc tem total acesso (incluindo SELECT, INSERT, UPDATE e DELETE),
já que esse tipo de trigger só é executado antes do UPDATE ou depois que
todo ele é executado.

Acontece que é muito comum vc precisar do melhor dos 2 mundos: vc precisa
ter acesso aos registros que estão sendo alterados através do :NEW ou :OLD
(trigger FOR EACH ROW) e vc também precisa fazer DML na própria tabela
(trigger STATEMENT). A solução que melhor resolve esse problema é vc ter uma
trigger FOR EACH ROW para salvar a identificação dos registros que estão
sendo afetados em uma PACKAGE ou em uma tabela GLOBAL TEMPORARY (eu prefiro
usar tabelas GLOBAL TEMPORARY) e outra trigger STATEMENT AFTER para fazer os
DMLs na própria tabela baseados nos registros salvos pela trigger FOR EACH
ROW. Vc precisa da PACKAGE ou da tabela GLOBAL TEMPORARY para que possa
haver comunicação entre as 2 triggers. Não é uma tarefa mto básica, mas
depois que vc faz a primeira vez fica fácil :)

Existem exemplos na internet que resolvem esse problema utilizando transação
autônoma. Se vc utiliza o tal "PRAGMA autonomous_transaction;" na trigger
FOR EACH ROW, é aberta outra transação diferente da principal para rodar o
código dessa trigger. Então, utilizando o exemplo que eu coloquei acima,
apesar do UPDATE ainda não ter sido finalizado, vc vai enchergar a tabela na
situação de antes da execução do UPDATE, porquê vc está em outra transação.
Isso permite vc fazer select na própria tabela. Pra alguns casos pode
realmente resolver, mas isso depende do problema. A solução das 2 triggers é
mais genérica, então vale à pena aprendê-la...

Acabei escrevendo demais... rs Tomara que tenha ajudado.

Um abraço,

Marcos


Em 25 de março de 2010 09:20, Raul Francisco Costa F. de Andrade, DBA <
raulf...@gmail.com> escreveu:

>
>
> Marcos, o que é tabela mutante?
>
> Em 24 de março de 2010 15:06, Marcos de Moura Gonçalves
>
> <mgmar...@gmail.com <mgmarcos%40gmail.com>>escreveu:
>
> > Que bom cara! Veja a possibilidade de eliminar o "PRAGMA
> > autonomous_transaction;" dessa trigger. Se ela estiver utilizando
> > transações
> > autônomas por causa de erro de tabela mutante (o q é mto comum de se
> > ver...), vc pode dar uma olhada em alguns outros e-mails dessa própria
> > lista
> > que o pessoal está dando dicas de como resolver esse problema. É um
> > problema
> > muito comum, e normalmente usar transação autônoma pra isso não é a
> melhor
> > solução.
> >
> > []'s
> >
> > Marcos
> >
> >
> > Em 24 de março de 2010 12:33, Raul Francisco Costa F. de Andrade, DBA <
> > raulf...@gmail.com <raulfdba%40gmail.com>> escreveu:
> >
> > >
> > >
> > > Cara deu certo!!!
> > > Era uma maldita trigger que alguém colocou e nela tinha o pragma...
> > >
> > > Muito obrigado!!!
> > >
> > > []'s
> > >
> > > Raul
> > >
> > > Em 24 de março de 2010 11:51, Marcos de Moura Gonçalves
> > >
> > > <mgmar...@gmail.com <mgmarcos%40gmail.com> <mgmarcos%40gmail.com
> >>escreveu:
>
> > >
> > > > O erro está aparecendo quando? Na compilação da view?
> > > >
> > > > Em relação ao "PRAGMA autonomous_transaction;", eu me referi a
> > possíveis
> > > > códigos que chamam a view (triggers, procedures...), e não à view
> > > > propriamente dita. Você pode identificar objetos que referenciam essa
> > > view
> > > > pelo select abaixo:
> > > >
> > > > SELECT * FROM dba_dependencies
> > > > WHERE referenced_owner = 'OWNER' and referenced_name =
> 'ACT_EXEC_ARG';
> > > >
> > > > []'s
> > > >
> > > > Marcos
> > > >
> > > > Em 24 de março de 2010 11:35, Raul Francisco Costa F. de Andrade, DBA
> <
> > > > raulf...@gmail.com <raulfdba%40gmail.com> <raulfdba%40gmail.com>>
> escreveu:
>
> > > >
> > > > >
> > > > >
> > > > > Obrigado pela resposta amigo...
> > > > >
> > > > > Mas a view que estou criando é apenas assim:
> > > > >
> > > > > CREATE FORCE VIEW owner.act_exec_arg(arg_id, subsystem, program_id,
> > > > > arg_line
> > > > >
> > > > > , flg_used, job_id) AS SELECT "ARG_ID", "SUBSYSTEM", "PROGRAM_ID",
> > > > > "ARG_LINE", "FLG_USED", "JOB_ID" FROM master.act_exec_...@db_link;
> > > > > Não usei PRAGMA
> > > > >
> > > > > Att.
> > > > >
> > > > > Raul
> > > > >
> > > > > Em 24 de março de 2010 11:19, Marcos de Moura Gonçalves
> > > > > <mgmar...@gmail.com <mgmarcos%40gmail.com> <mgmarcos%40gmail.com>
> <mgmarcos%40gmail.com
>
> > > >>escreveu:
> > >
> > > > >
> > > > >
> > > > > > Olá Raul!
> > > > > >
> > > > > > Esse erro aparece quando? Provavelmente vc está chamando essa
> view
> > > > dentro
> > > > > > de
> > > > > > uma "autonomous transaction", que ocorre quando vc coloca a opção
> > > > "PRAGMA
> > > > > > autonomous_transaction;" em uma trigger, por exemplo. Isso serve
> > pra
> > > vc
> > > > > > executar um determinado código numa transação diferente da
> > principal,
> > > e
> > > > > > dessa forma vc poderia fugir de erros como o de Mutating table.
> > Essa
> > > > view
> > > > > > se
> > > > > > enquadraria em uma distributed transaction, já que ela utiliza um
> > > banco
> > > > > de
> > > > > > dados remoto, e o Oracle 8i possui uma limitação de não permitir
> a
> > > > > > utilização de autonomous transaction em uma distributed
> > transaction.
> > > > > >
> > > > > > Nesse caso, a solução imediata seria tentar não utilizar o PRAGMA
> > > > > > autonomous_transaction no código que chama a view. Se vc está
> > > > utilizando
> > > > > > autonomous transaction pra fugir do problema de tabelas mutantes,
> > > > existem
> > > > > > outras maneira mais eficazes de realizar essa tarefa.
> > > > > >
> > > > > > Encontrei esse site que fala sobre a utilização de SET
> TRANSACTION
> > > READ
> > > > > > ONLY, caso faça apenas SELECT no código. Pode ser uma tentativa:
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> http://64.233.163.132/search?q=cache:oUcHJFAtWJkJ:www.experts-exchange.com/Database/Oracle/Q_21089621.html+ORA-00164&cd=6&hl=pt-BR&ct=clnk&gl=br&client=firefox-a
> > > > > >
> > > > > > []'s
> > > > > >
> > > > > > Marcos
> > > > > >
> > > > > >
> > > > > > Em 23 de março de 2010 18:11, Raul Francisco Costa F. de Andrade,
> > DBA
> > > <
> > > > > > raulf...@gmail.com <raulfdba%40gmail.com> <raulfdba%40gmail.com>
> <raulfdba%40gmail.com>>
>
> > > escreveu:
> > >
> > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Pessoal, boa tarde.
> > > > > > >
> > > > > > > Estou precisando criar uma view num banco oracle 8.1.7.0.4 que
> > > aponta
> > > > > > para
> > > > > > > uma tabela em uma outra base 10.2.0.4 via dblink.
> > > > > > >
> > > > > > > Estou tomando o erro:
> > > > > > >
> > > > > > > ORA-00164: autonomous transaction disallowed within distributed
> > > > > > transaction
> > > > > > > Li que existe problema às vezes com a versão 8i... Mas teria
> que
> > > > > > funcionar,
> > > > > > > pois tenho o mesmo cenário em homologação e funciona.
> > > > > > >
> > > > > > > CREATE FORCE VIEW act_exec_arg(arg_id, subsystem, program_id,
> > > > > > > arg_line,flg_used
> > > > > > > , job_id) AS
> > > > > > >
> > > > > > > SELECT "ARG_ID", "SUBSYSTEM", "PROGRAM_ID", "ARG_LINE",
> > "FLG_USED",
> > > > > > > "JOB_ID"
> > > > > > >
> > > > > > > FROM master.act_exec_...@db_arch;
> > > > > > >
> > > > > > > Desde já muito obrigado!!
> > > > > > >
> > > > > > > Raul
> > > > > > >
> > > > > > > --
> > > > > > > ----------------------------------------------------------
> > > > > > > Raul Francisco da Costa Ferreira de Andrade
> > > > > > > DBA - OCA - Oracle Certified Associate
> > > > > > > COBIT Foundation 4.1
> > > > > > > Fone: (41)8855-8874 Brt
> > > > > > > email: raulf...@gmail.com <raulfdba%40gmail.com> <raulfdba%
> 40gmail.com> <raulfdba%
> > > 40gmail.com> <raulfdba%
> > >
> > > > 40gmail.com
> > > > > >
> > > > >
> > > > > > > Skype: raul.andrade
> > > > > > > www.clickdba.com
> > > > > > > "Deus não dá prova superior às forças daquele que a pede;
> > > > > > > só permite as que podem ser cumpridas.
> > > > > > > Se tal não sucede, não é que falte possibilidade, falta
> vontade."
> > > > > > >
> > > > > > > [As partes desta mensagem que não continham texto foram
> > removidas]
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > > [As partes desta mensagem que não continham texto foram
> removidas]
> > > > > >
> > > > > >
> > > > > >
> > > > > > ------------------------------------
> > > > >
> > > > > >
> > > > > >
> > > > > > ----------------------------------------------------------
> > > > > > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e
> > de
> > > > > > inteira responsabilidade de seus remetentes.
> > > > > > Acesse:
> http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> > > > > >
> > > > > > ----------------------------------------------------------
> > > > > > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> > > > > Procedure
> > > > > > » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO!
> > > > VISITE:
> > > > > > http://www.oraclebr.com.br/
> > > > > > ----------------------------------------------------------
> > > > > > Links do Yahoo! Grupos
> > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > > --
> > > > > ----------------------------------------------------------
> > > > > Raul Francisco da Costa Ferreira de Andrade
> > > > > DBA - OCA - Oracle Certified Associate
> > > > > COBIT Foundation 4.1
> > > > > Fone: (41)8855-8874 Brt
> > > > > email: raulf...@gmail.com <raulfdba%40gmail.com> <raulfdba%
> 40gmail.com> <raulfdba%
> > 40gmail.com
> > > >
> > > > > Skype: raul.andrade
> > > > > www.clickdba.com
> > > > > "Deus não dá prova superior às forças daquele que a pede;
> > > > > só permite as que podem ser cumpridas.
> > > > > Se tal não sucede, não é que falte possibilidade, falta vontade."
> > > > >
> > > > > [As partes desta mensagem que não continham texto foram removidas]
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > > >
> > > >
> > > > ------------------------------------
> > > >
> > > >
> > > > ----------------------------------------------------------
> > > > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> > > > inteira responsabilidade de seus remetentes.
> > > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> > > >
> > > > ----------------------------------------------------------
> > > > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> > > Procedure
> > > > » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO!
> > VISITE:
> > > > http://www.oraclebr.com.br/
> > > > ----------------------------------------------------------
> > > > Links do Yahoo! Grupos
> > > >
> > > >
> > > >
> > >
> > > --
> > > ----------------------------------------------------------
> > > Raul Francisco da Costa Ferreira de Andrade
> > > DBA - OCA - Oracle Certified Associate
> > > COBIT Foundation 4.1
> > > Fone: (41)8855-8874 Brt
> > > email: raulf...@gmail.com <raulfdba%40gmail.com> <raulfdba%40gmail.com
> >
> > > Skype: raul.andrade
> > > www.clickdba.com
> > > "Deus não dá prova superior às forças daquele que a pede;
> > > só permite as que podem ser cumpridas.
> > > Se tal não sucede, não é que falte possibilidade, falta vontade."
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
> > ------------------------------------
> >
> >
> > ----------------------------------------------------------
> > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> > inteira responsabilidade de seus remetentes.
> > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> >
> > ----------------------------------------------------------
> > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> Procedure
> > » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE:
> > http://www.oraclebr.com.br/
> > ----------------------------------------------------------
> > Links do Yahoo! Grupos
> >
> >
> >
>
> --
> ----------------------------------------------------------
> Raul Francisco da Costa Ferreira de Andrade
> DBA - OCA - Oracle Certified Associate
> COBIT Foundation 4.1
> Fone: (41)8855-8874 Brt
> email: raulf...@gmail.com <raulfdba%40gmail.com>
> Skype: raul.andrade
> www.clickdba.com
> "Deus não dá prova superior às forças daquele que a pede;
> só permite as que podem ser cumpridas.
> Se tal não sucede, não é que falte possibilidade, falta vontade."
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>


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



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

--------------------------------------------------------------------------------------------------------------------------
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  
------------------------------------------------------------------------------------------------------------------------
 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:
    oracle_br-unsubscr...@yahoogrupos.com.br

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


Responder a