RMESTRE 0 Denunciar post Postado Agosto 9, 2010 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: Estou usando: - PL/SQL Developer - Oracle 9i Grato, Renato Mestre Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Agosto 9, 2010 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
RMESTRE 0 Denunciar post Postado Agosto 9, 2010 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
Motta 645 Denunciar post Postado Agosto 9, 2010 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
RMESTRE 0 Denunciar post Postado Agosto 9, 2010 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
Motta 645 Denunciar post Postado Agosto 9, 2010 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
RMESTRE 0 Denunciar post Postado Agosto 9, 2010 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
Motta 645 Denunciar post Postado Agosto 9, 2010 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
RMESTRE 0 Denunciar post Postado Agosto 9, 2010 É... 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