Importação XML

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

Pessoal,
Bom dia!
Estou ajudando meu pai com a autopeças dele, e preciso de uma ajuda de vocês.
Dei uma pesquisada aqui no fórum, vi diversos assuntos de xml, porém não um com minha dúvida especifíca.
Preciso importar de um xml, com cabeçalho e itens de pedidos(vários), existe alguma forma de fazer isso somente em uma proc?
Ou seja, importanto todo o xml?
Via select into não é possível, pois dá irá apresentar too many rows.
Abaixo segue um exemplo para ilustrar...
Obrigado desde já! :)

<AvisoRecebimento>
<CodFilial>123</CodFilial>
<Recebimentos>
<Recebimento>
<NumPedido>13456</NumPedido>
<NumNF>748387</NumNF>
<SerieNF>1</SerieNF>
<Itens>
<Item>
<NumLinha>1</NumLinha>
<SKU>2221292</SKU>
<Quantidade>1</Quantidade>
<UnidManejo>UN</UnidManejo>
</Item>
<Item>
<NumLinha>2</NumLinha>
<SKU>0430100</SKU>
<Quantidade>2</Quantidade>
<UnidManejo>UN</UnidManejo>
<NumLote>2</NumLote>
<DtValidade>14/03/2012 13:13:13</DtValidade>
<DtFabricacao>14/03/2012 13:13:13</DtFabricacao>
<QtdLote>1</QtdLote>
<Deposito>1</Deposito>
<TipoEstoque>DISP</TipoEstoque>
</Item>
</Itens>
</Recebimento>
</Recebimentos>
</AvisoRecebimento>
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

você tem isso num arquivo ou já carregado no banco?

acho que você poderia carregar isso pra uma coluna no seu banco de dados ( datatype XMLTYPE ).

tendo o xml nessa coluna fica mais fácil de você escrever o que você precisa,

existem pacotes do banco que irão auxiliar. ( google DBMS + XML )

http://www.orafaq.com/wiki/DBMS_XMLGEN
guterror
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 27
Registrado em: Qua, 03 Out 2012 3:29 pm

Na verdade já tenho isso em banco num campo xml datatype, e inclusive meu select está retornando os valores certinhos.
Comando abaixo:
SELECT DISTINCT EXTRACTVALUE(VALUE(AvisoRecebimento), '/AvisoRecebimento/CLMCL') CLMCL,
EXTRACTVALUE(VALUE(AvisoRecebimento), '/AvisoRecebimento/CodFilial') CodFilial,
EXTRACTVALUE(VALUE(AvisoRecebimento), '/AvisoRecebimento/DtCriacao') DtCriacao,
EXTRACTVALUE(VALUE(recebimento), '/Recebimento/Divisao') Divisao,
EXTRACTVALUE(VALUE(recebimento), '/Recebimento/TipoRecebimento') TipoRecebimento,
EXTRACTVALUE(VALUE(recebimento), '/Recebimento/NumPedido') NumPedido,
EXTRACTVALUE(VALUE(recebimento), '/Recebimento/NumNF') NumNF,
EXTRACTVALUE(VALUE(recebimento), '/Recebimento/SerieNF') SerieNF,
EXTRACTVALUE(VALUE(recebimento), '/Recebimento/DtEmissaoNF') DtEmissaoNF,
EXTRACTVALUE(VALUE(Recebimento), '/Recebimento/CNPJ') CNPJ,
EXTRACTVALUE(VALUE(Item), '/Item/NumLinha') NumLinha,
EXTRACTVALUE(VALUE(Item), '/Item/SKU') SKU,
EXTRACTVALUE(VALUE(Item), '/Item/Quantidade') Quantidade,
EXTRACTVALUE(VALUE(Item), '/Item/UnidManejo') UnidManejo,
EXTRACTVALUE(VALUE(Lote), '/Lote/NumLote') NumLote,
EXTRACTVALUE(VALUE(Lote), '/Lote/DtValidade') DtValidade,
EXTRACTVALUE(VALUE(Lote), '/Lote/DtFabricacao') DtFabricacao,
EXTRACTVALUE(VALUE(Lote), '/Lote/QtdLote') QtdLote,
EXTRACTVALUE(VALUE(Lote), '/Lote/Deposito') Deposito,
EXTRACTVALUE(VALUE(Lote), '/Lote/TipoEstoque') TipoEstoque

FROM CUSTOM_XML_RECEIVED B,
TABLE(XMLSEQUENCE(EXTRACT(B.CONTEUDO_ARQUIVO, '/AvisoRecebimento'))) AvisoRecebimento,
TABLE(XMLSEQUENCE(EXTRACT(B.CONTEUDO_ARQUIVO, '/AvisoRecebimento/Recebimentos/Recebimento'))) recebimento,
TABLE(XMLSEQUENCE(EXTRACT(B.CONTEUDO_ARQUIVO,'/AvisoRecebimento/Recebimentos/Recebimento/Itens/Item'))) Item,
TABLE(XMLSEQUENCE(EXTRACT(B.CONTEUDO_ARQUIVO, '/AvisoRecebimento/Recebimentos/Recebimento/Itens/Item/Lotes/Lote'))) Lote;


Porém, preciso agora "quebrar" o xml, e como há mais de um item por "pedido" ao inserir no banco via select into, da a mensagem de too many rows.
Qual seria a forma mais simples de fazer isso?

Obrigado!!
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

guterror
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 27
Registrado em: Qua, 03 Out 2012 3:29 pm

Diego,
Vou dar uma olhada, obrigado !!!
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

opa.. beleza, qualquer coisa posta aí,

o esquema pra tu são os loops..
guterror
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 27
Registrado em: Qua, 03 Out 2012 3:29 pm

Valeu Diego!
Consegui fazer via bulk collect, olha o exemplo abaixo:

type t_gu is table of c_gu%rowtype;
reg_gu t_gu;

open c_gu;
fetch c_gu bulk collect into reg_gu;
close c_gu;

for ind in 1.. reg_gu.count loop

:-o
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

massa cara, eu usei isso uma vez só, não lembrava exatamente como era...

:D
Responder
  • Informação