Alterar valor no nó XML dentro de campo CLOB

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Pessoal, antes de postar aqui pesquisei no forum e não localizei algum tópico que pudesse ajudar a esclarecer a minha dúvida. Por isso, gostaria de contar com a colaboração dos companheiros se possível. Lá vai.

A minha dúvida é que possuo uma tabela com uma coluna do tipo CLOB que armazena o resultado de um XML, no entanto, preciso consistir e validar o conteúdo deste campo, tendo que alterar os valores dentre as tags, exemplo:

Selecionar tudo


<?xml version="1.0"?>
<ROWSET>
   <ROW num="1">
      <COD_CIA>1</COD_CIA>
      <COD_SECTOR>18</COD_SECTOR>
      <COD_RAMO>117</COD_RAMO>
      <NOM_RAMO>APOLICE LIDER</NOM_RAMO>
      <ABR_RAMO>LIDER</ABR_RAMO>
   </ROW>
</ROWSET>

Onde ao ínvés do valor do nó "COD_RAMO" ser 117 deveria ser 17? Como posso realizar essa alteração?

Estou utilizando o Oracle 9 e pesquisando na internet encontrei dois pacotes:

- dbms_xmlquery;
- dbms_xmlgen;

Ou a função:

- updatexml;

Que tentei usar da seguinte maneira:

Selecionar tudo

select updatexml(l_xmltype.getClobVal),'/ROWSET/ROW/COD_RAMO/text()','17';
Mas até agora não consegui obter o resultado desejado.

Se alguém souber e puder ajudar, desde já agradeço.

Att.,
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Eu consegui simular o seu problema.
O comando UPDATEXML não pode ser usado com campo CLOB, tem que ser XMLTYPE.
Neste caso, ou você cria uma tabela convertendo o campo da sua tabela, transformando pra XMLTYPE, ou converte na hora!

Veja:

Selecionar tudo

CREATE TABLE glufke_test
( id       NUMBER
, codXML   CLOB--XMLType 
)

Selecionar tudo

INSERT INTO glufke_test 
VALUES(1,
'<?xml version="1.0"?>
<ROWSET>
   <ROW num="1">
      <COD_CIA>1</COD_CIA>
      <COD_SECTOR>18</COD_SECTOR>
      <COD_RAMO>117</COD_RAMO>
      <NOM_RAMO>APOLICE LIDER</NOM_RAMO>
      <ABR_RAMO>LIDER</ABR_RAMO>
   </ROW>
</ROWSET>'
)
A query pra testar:

Selecionar tudo

SELECT id,
   EXTRACT( XMLType(codXML), '/ROWSET/ROW') ramo
FROM glufke_test
WHERE id = 1
Saída:

Selecionar tudo

        ID RAMO
---------- --------------------------------------------------------------------------------
         1 <ROW num="1"><COD_CIA>1</COD_CIA><COD_SECTOR>18</COD_SECTOR><COD_RAMO>117</COD_R
 
SQL> 
Agora vou fazer o update, convertendo com XMLTYPE():

Selecionar tudo

UPDATE glufke_test SET codXML =
   TO_CLOB(  UPDATEXML( XMLType(codXML)
                      , '/ROWSET/ROW/COD_RAMO/text()'
                      ,200)
          )
WHERE id = 1

Vamos ver se converteu:

Selecionar tudo

        ID RAMO
---------- --------------------------------------------------------------------------------
         1 <ROW num="1"><COD_CIA>1</COD_CIA><COD_SECTOR>18</COD_SECTOR><COD_RAMO>200</COD_R
 
SQL> 
Repare que o COD_RAMO agora é 200!

Aqui tem 2 links bons:
http://docs.oracle.com/cd/B10501_01/app ... tm#1032735
http://docs.oracle.com/cd/B19306_01/ser ... ons205.htm

:-o
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Obrigado Dr_Gori.

Agora, se o datatype da coluna fosse LONG, o procedimento seria o mesmo?

Att.,
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Não testei se funciona. Mas acredito que NÃO.
LONG é um negócio muito antigo. A partir da versão 8i a Oracle recomenda usar LOB, CLOB, etc.

Campos LONG é sempre um parto :-(
Só testando mesmo.
claudioreiis01
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Ter, 25 Ago 2015 1:31 pm

dr_gori beleza?
Existe algum jeito de ler este 1 desta tag

Selecionar tudo

<ROW num="1">
e se caso você tiver

Selecionar tudo

<ROW num="2"> <ROW num="3">
tem como criar um loop para ler este caso?
pois eu só consigo ler um item simples onde só tem um produto e não consigo fazer um loop para ler vários produtos com o extract ou extractValue ele da erro dizendo que ele retorna mais de um nó.... Você pode me dizer como fazer?
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes