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>
Importação XML
-
- 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
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
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!!
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!!
-
- Moderador
- Mensagens: 1177
- Registrado em: Qui, 15 Out 2009 10:28 am
- Localização: Recife
Veja esses links, acho que resolve...
http://martin-mares.com/2010/08/oracle- ... lsequence/
http://stackoverflow.com/questions/9858 ... type-nodes
http://martin-mares.com/2010/08/oracle- ... lsequence/
http://stackoverflow.com/questions/9858 ... type-nodes
Diego,
Vou dar uma olhada, obrigado !!!
Vou dar uma olhada, obrigado !!!
-
- 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..
o esquema pra tu são os loops..
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
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
-
- 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...
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes