Resgatar valor da tag de um XMLType

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
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Pessoal, tenho o seguinte XML que está carregado dentro de uma variável XMLType:

Selecionar tudo

<cab>
 <nome>Joao</nome>
</cab>
<dados>
 <idade>32</idade>
 <opt>sim</opt>
</dados>
Estou tentando capturar o seu nome de dentro da variável XMLType desta forma:

Selecionar tudo

var_nome := varXml.extract('/cab/nome/text()').getstringval();
Porém está disparando o seguinte erro:

Selecionar tudo

erro: ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00245: extra data after end of document
Os exemplos que encontrei, todos se baseiam em tabelas para manipular XML, existe uma forma do Oracle manipular um XML sem ser por tabelas?
carloscsilva
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Qui, 26 Jul 2012 8:55 am
" Pense diferente! - "

Boa tarde, pyro!

Segue abaixo um exemplo de xml, através de um SQL. Os métodos mais usados para manipular XML são com eles gravados em tabela, devido a necessidade de ficar um processo automático.

Selecionar tudo

select *
  from XMLTable
  (
    'for $documento in /documento
       for $itens in $documento/itens
         for $item in $itens/item
           return <row>
           { $documento
           , $itens
           , $item
           }
         </row>
    '
    passing
    ( XMLTYPE
      ( '<?xml version="1.0" encoding="ISO-8859-1" ?>
  <conciliacao_doc>
  <dt_emissao>20111213</dt_emissao>
  <documento>
  <tipo_doc>T</tipo_doc>
  <num_doc>120</num_doc>
  <dt_mov>20111201</dt_mov>
  <local_origem>A1</local_origem>
  <destinatario_nome>LocalA</destinatario_nome>
  <destinatario_cpf />
  <destinatario_cnpj>34343232123467</destinatario_cnpj>
  <itens>
  <item>
  <transacao>475</transacao>
  <tipo_transacao>I</tipo_transacao>
  <tipo_mov_bo />
  <cod_produto>222</cod_produto>
  <qtd_transacao>5</qtd_transacao>
  <unid_medida>un</unid_medida>
  </item>
  <item>
  <transacao>476</transacao>
  <tipo_transacao>I</tipo_transacao>
  <tipo_mov_bo />
  <cod_produto>3455</cod_produto>
  <qtd_transacao>5</qtd_transacao>
  <unid_medida>un</unid_medida>
  </item>
  <item>
  <transacao>477</transacao>
  <tipo_transacao>I</tipo_transacao>
  <tipo_mov_bo />
  <cod_produto>3000</cod_produto>
  <qtd_transacao>5</qtd_transacao>
  <unid_medida>un</unid_medida>
  </item>
  </itens>
  </documento>
  <documento>
  <tipo_doc>B</tipo_doc>
  <num_doc>2301</num_doc>
  <dt_mov>20111201</dt_mov>
  <local_origem>B</local_origem>
  <destinatario_nome />
  <destinatario_cpf />
  <destinatario_cnpj />
  <itens>
  <item>
  <transacao />
  <tipo_transacao />
  <tipo_mov_bo>E</tipo_mov_bo>
  <cod_produto>1000</cod_produto>
  <qtd_transacao>6</qtd_transacao>
  <unid_medida>un</unid_medida>
  </item>
  <item>
  <transacao />
  <tipo_transacao />
  <tipo_mov_bo>E</tipo_mov_bo>
  <cod_produto>1096</cod_produto>
  <qtd_transacao>6</qtd_transacao>
  <unid_medida>un</unid_medida>
  </item>
  <item>
  <transacao />
  <tipo_transacao />
  <tipo_mov_bo>E</tipo_mov_bo>
  <cod_produto>1097</cod_produto>
  <qtd_transacao>6</qtd_transacao>
  <unid_medida>un</unid_medida>
  </item>
  <item>
  <transacao />
  <tipo_transacao />
  <tipo_mov_bo>E</tipo_mov_bo>
  <cod_produto>1099</cod_produto>
  <qtd_transacao>6</qtd_transacao>
  <unid_medida>un</unid_medida>
  </item>
  <item>
  <transacao />
  <tipo_transacao />
  <tipo_mov_bo>S</tipo_mov_bo>
  <cod_produto>7021</cod_produto>
  <qtd_transacao>1</qtd_transacao>
  <unid_medida>un</unid_medida>
  </item>
  </itens>
  </documento>
  <tot_itens_arquivo>8</tot_itens_arquivo>
  </conciliacao_doc>'
      ).extract('conciliacao_doc/documento')
    )
  columns num_doc number path 'documento/num_doc'
        , transacao number path 'item/transacao'
        , tipo_transacao varchar2(5) path 'item/tipo_transacao'
        , tipo_mov_bo varchar2(5) path 'item/tipo_mov_bo'
        , cod_produto number path 'item/cod_produto'
        , qtd_transacao number path 'item/qtd_transacao'
        , unid_medida varchar2(5) path 'item/unid_medida'
)
Responder
  • Informação
  • Quem está online

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