Ler XML - identificar apenas os itens do documento pai

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
admendes
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Seg, 19 Dez 2011 3:44 pm

Bom Dia.

Preciso de uma ajuda. Trabalho com oracle pl/sql e preciso ler um arquivo xml, como abaixo. Para o num_doc = 120 preciso identificar que os cod_produto : 222,3455 e 3000 fazem parte dele. E para o num_doc = 2301 preciso recuperar apenas os itens com cod_produto = 1000, 1096, 1097, 1099 e 7021.

Usando o comando xslprocessor.valueof (v_n, '.') conseguimos recuperar uma linha com os itens de cada documento, certinho, mas ele vem em uma linha única, tudo misturado e não me atende.

Eu preciso identicar os itens corretamente para gravar nas tabelas as informações corretas.

Tem algum comando que eu possa usar e que filtre? Tipo, pegar só os itens do documento que acabei de ler?

Aguardo e obrigada.


<?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>
guterror
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 27
Registrado em: Qua, 03 Out 2012 3:29 pm

Utilizando a função extractvalue, não dá certo?
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Nunca usei em uma situação real, mas acredito que seja possível obter as informarções que você precisa com isso:

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'
)

Selecionar tudo

| NUM_DOC | TRANSACAO | TIPO_TRANSACAO | TIPO_MOV_BO | COD_PRODUTO | QTD_TRANSACAO | UNID_MEDIDA |
|---------|-----------|----------------|-------------|-------------|---------------|-------------|
|     120 |       475 | I              |             |         222 |             5 | un          |
|     120 |       476 | I              |             |        3455 |             5 | un          |
|     120 |       477 | I              |             |        3000 |             5 | un          |
|    2301 |           |                | E           |        1000 |             6 | un          |
|    2301 |           |                | E           |        1096 |             6 | un          |
|    2301 |           |                | E           |        1097 |             6 | un          |
|    2301 |           |                | E           |        1099 |             6 | un          |
|    2301 |           |                | S           |        7021 |             1 | un          |
Responder
  • Informação