Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RMESTRE

[Resolvido] Trigger AUR em campo / coluna XmlType

Recommended Posts

Bom dia meus caros! Esse é meu 1º POST, tenham paciência com meus possíveis equívocos :)

 

Direto ao assunto:

 

Problema: Está dando um erro vazio (sem mensagem nem código de erro.)

 

Um alert vazio mesmo - veja o print no final) quando executo um UPDATE, por causa de uma trigger.

 

Como simular o erro:

 

A tabela

create table TESTE_XML
(
    xml XMLTYPE,
    campo_teste VARCHAR2(1)   
);

A trigger. (além de causar um erro vazio rsss)

Create or Replace Trigger trg_aur_teste_xml
   AFTER UPDATE OF xml ON teste_xml
DECLARE
   v_xml xmltype;
BEGIN
   v_xml := :NEW.xml;   
END trg_aur_teste_xml;

Um insert pra ter registro na tabela

INSERT INTO Teste_Xml VALUES ('', 'A');

O update que dá o erro

 

SELECT * FROM Teste_Xml FOR UPDATE;

Após o comando acima, edite o registro, cole o XML no campo e POST!

 

No momento do POST, vai ocorrer o erro.

 

Eis um XML pra teste:

<OS>

<ATRIBUTO>

<CODIGO>ABCDE</CODIGO>

<VALOR>12345</VALOR>

</ATRIBUTO>

</OS>

 

Print do erro:

Imagem Postada

 

Estou usando:

 

- PL/SQL Developer

- Oracle 9i

 

 

Grato,

Renato Mestre

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) Creio que a trigger que postou é apenas uma simplificação pois ela nada faz, qual seria sua real função ? Tentou dropar a trigger e ver o que ocorre ?

 

2) Não postou o update em sim e sim o SELECT FOR UPDATE, este comando faz um select locando o registro para que não seja alterado por outro usuário.

 

Como se trata se XML o erro pode ainda estar na camada da aplicação, algum problema na montagem do mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perfeitamente, colega. Primeiramente agradeço sua reposta. Vamo lá:

 

Sim, simplifiquei a trigger, postando apenas o suficiente pra que o erro ocorresse.

 

Tentei dropar e aí resolveu. Mas ao recriar a trigger, o erro volta.

 

Postei o SELECT FOR UPDATE pois fazendo com um simples UPDATE o erro não ocorre, entendeu?

 

Só vim ao fórum depois de rodar debugando a aplicação, a fim de verificar a montagem do XML. Está montando de acordo sim. Então eu quis mostrar aqui no fórum como o erro ocorre, mesmo trabalhando direto no banco, sem aplicação.

 

 

E agora?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que a trigger faria ?

Como se trata de um lock o erro poderia estar em alguma tabela secundária sendo gravada, mas pelo visto ocorre mesmo com a trigger simplificada.

A aplicação faz uso de TRANSACTION?

A aplicação faz algum tratamento de erro ? Poderia está mascarando o erro. Tente forçar outro tipo de erro, como um duplicate key para ver se a aplicação mascara erros (se for o caso).

Compartilhar este post


Link para o post
Compartilhar em outros sites

A trigger pega algumas informações do XML e insere-as em outra tabela, através de um INSERT. Simples assim.

 

A aplicação usa transaction sim. Tratei as exceções e tentei forçar outro erro. Infelizmente não está mascarando. Apresentou o erro que eu causei. Corrigi o erro proposital e agora me trouxe o mesmo erro que o Oracle apresentou: o alert vazio.

 

Notei que se eu retirar o "FOR EACH ROW" da trigger, não dá o erro. Mas o problema é que assim não posso utilizar :NEW pra pegar as informações que preciso.

 

Motta, agradeço muito a sua ajuda! Provavelmente eu resolva de outra forma (aidna não sei como) mas gostaria muito de saber sobre esse erro "vazio" do Oracle.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca vi este vazio vindo do Oracle.

 

Pelo viso consegue ler o contéudo do XML o que afsta a hipótese de ser alguma zebra nele.

 

Na tabela que sofre o insert existe alguma trigger ? Pode ser algo com efeito cascata.

 

Nesta tabela se consegue um insert na mão ? Via SqlPlus por exemplo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido :)

 

Descartei a hipótese de efeito cascata quando consegui simular do jeito que postei aqui (trigger não fazendo nada).

 

Consigo sim fazer INSERT e UPDATE na mão, sem problemas. Inclusive no campo xml.

 

Novidade: debugando a aplicação, resolvi tirar o tratamento de transaction ("edit -> post -> commit") e fazer o UPDATE diretão. Aí foi numa boa!

 

Lição aprendida: quando houver trigger em coluna xmltype, não utilize transaction para fazer INSERT ou UPDATE nessa tabela. (É isso mesmo?)

 

Obrigado Motta! Nada como ser ajudado por um especialista entendido do assunto...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sou especialista, sequer sou DBA apenas um analista com algum tempo de Oracle.

 

... quando houver trigger em coluna xmltype, não utilize transaction para fazer INSERT ou UPDATE nessa tabela ...

Realmente não sei se isto é verdade, mas achei isto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É... também estou na dúvida em afirmar isto, sobre transactions. Mas pra esse caso em específico é verdade.

 

Li o post que você linkou mas não é bem o mesmo problema. A semelhança entre eu e ele é que nossas sessões "congelavam" com o erro. Mas o dele provavelmente é proveniente da presença de caracteres especiais e o CHARSET utilizado. Assim como no meu caso, ele parece estar conseguindo ler o XML corretamente. Parece!

 

Outra diferença nossa é que eu postei no fórum correto rsss

 

Bom, agora é testar se funciona pra XML's maiores que 5Kb, pois já vi da pau na gravação de XML's muito grandes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.