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>
Ler XML - identificar apenas os itens do documento pai
Utilizando a função extractvalue, não dá certo?
-
- 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:
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'
)
| 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 |
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante