- Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 17 anos, 5 meses atrás por
Ishii.
-
AutorPosts
-
24 de setembro de 2008 às 5:47 pm #82874
Anônimo
Bom dia srs,
Estou construindo uma trigger na qual antes de atualizar/deletar um registro, tenho que dar um select na própria tabela que está sendo modificada, devido a executar joins em outras tabelas.
Minha dúvida é:
Como não posso executar uma instrução que necessito na tabela que está sendo alterada (ver erro abaixo), onde posso “armazenar” o registro em questão numa estrutura na qual possa dar joins em outras tabelas existentes???
Se eu colocar em um tipo de collection, posso fazer isto:
select
t1.a,
t1.b,
t1.c,
type_collection.a,
type_collection.b
from
t1
inner join type_collection ….ERRO:
—————————————————————–UPDATE WEB.”CLIENTES” SET DAT_COMPRA = TO_DATE(’21/02/08′, ‘DD/MM/RR’) WHERE ROWID = ‘AAAKVQAAQAABpu9AAN’
One error saving changes to table WEB.”CLIENTES”:
Row 1: ORA-04091: table WEB.CLIENTES is mutating, trigger/function may not see it
ORA-06512: at “WEB.TRG_CLIENTES”, line 58
ORA-06512: at “WEB.TRG_CLIENTES”, line 204
ORA-04088: error during execution of trigger ‘WEB.TRG_CLIENTES’—————————————————————–
Att,
24 de setembro de 2008 às 5:59 pm #82876Marcio68Almeida
Participantevocê pode usar os atributos :NEW e :OLD para essa consulta…
24 de setembro de 2008 às 6:14 pm #82879Ishii
ParticipanteOlá,
Se você precisar mesmo fazer um select na própria tabela da trigger você pode utilizar também o parâmetro
PRAGMA AUTONOMOUS_TRANSACTION
Ele vai permitir que você faça o select – join com a própria tabela.
Outra opção, caso o BD seja inferior ao 8.1.0 é utilizar o execute immediate …
[]s Ishii
24 de setembro de 2008 às 6:28 pm #82884Anônimo
Ola a todos,
obrigado pelas dicas.
O “problema” de eu utilizar :NEW/:OLD é que teria que fazer um select assim (tabelas/nomes de campos apenas de exemplo):
SELECT
CLIENTES.NOME,
CLIENTES.DT_NASC,
CLIENTES_ENDERECOS.BAIRRO,
CLIENTES_TELEFONES.DDD
FROM
CLIENTES — tabela principal, que tenho que dar o join devido a outras tabelas auxiliares, “…table is mutating”
INNER JOIN CLIENTES_ENDERECOS
ON CLIENTES.COD_CLIENTE = CLIENTES_ENDERECOS.COD_CLIENTE
INNER JOIN CLIENTES_TELEFONES
ON CLIENTES.COD_CLIENTE = CLIENTES_TELEFONES.COD_CLIENTE
WHERE
…e consequentemente me gerando este erro.
Meu bd aqui é o 9i.
Vou testar estas opçções citadas e posto aqui novamentente.
grato
24 de setembro de 2008 às 7:26 pm #82892Anônimo
Inclui esta opção de ‘PRAGMA AUTONOMOUS_TRANSACTION;’ na minha trigger, e o select que eu precisava executar está, ok. Muito interessante esta opção.
Obrigado pessoal.
24 de setembro de 2008 às 9:36 pm #82896Ishii
ParticipanteOlá,
Para complementar o uso do PRAGMA AUTONOMOUS_TRANSACTION:
Quando for utilizar para fazer uma referência na própria tabela da trigger e depois um comando DML (insert, update ou delete) deve-se por um commit na trigger. Isso parece meio estranho mas é que esse comando abre uma nova sessão para executar a query da tabela da trigger, por isso o commit, para que seja “finalizada” a sessão.
[]s Ishii
-
AutorPosts
- Você deve fazer login para responder a este tópico.