Possuo a procedure que importa do xml o cabeçalho da Nota Fiscal, porém eu preciso também que puxe os itens da NF para inserir em uma outra tabela relacionando com o id da tabela TB_INFO_NFE, porém não sei como fazer, poderiam me ajudar.
create or replace procedure pr_import_xml as
var_err_IO number;
var_err_arq number;
var_tipo varchar2(20);
VAR_NUMERO varchar2(20);
VAR_EMISSAO varchar2(100);
VAR_CHAVE varchar2(100);
VAR_CNPJ varchar2(20);
VAR_TOTAL varchar2(20);
var_id number;
var_origem varchar2(200);
var_arq_sem_ext number;
var_aux XMLTYPE;
VAR_CIDADE_EMI varchar2(200);
VAR_RAZAO_EMI varchar2(200);
VAR_CNPJ_DEST varchar2(20);
VAR_CIDADE_DEST varchar2(200);
VAR_RAZAO_DEST varchar2(200);
VAR_NATUREZA VARCHAR2(200);
ex BOOLEAN;
flen NUMBER;
bsize NUMBER;
begin
for cur_arq in (select substr(a.column_value, 8) as file_name
from table(fn_list_files_xml_nfe) a
where substr(a.column_value, 1, 12) <> 'D:\xml\erros'
and substr(a.column_value, 1, 17) <>
'D:\xml\importados') loop
var_err_IO := 0;
var_err_arq := 0;
VAR_CNPJ := '';
VAR_NUMERO := '';
VAR_EMISSAO := '';
VAR_TOTAL := '';
VAR_CHAVE := '';
var_id := 0;
var_origem := '';
var_arq_sem_ext := 0;
VAR_NATUREZA := '';
select nvl(MAX(ID) + 1, 1) into var_id from TB_INFO_NFE;
--tratamento de arquivos que s?o salvos sem extensao
if substr(cur_arq.file_name, -4, 1) <> '.' THEN
var_arq_sem_ext := 1;
begin
var_aux := XMLTYPE(BFILENAME('XMLNFE', cur_arq.file_name),
NLS_CHARSET_ID('WE8ISO8859P1'));
var_tipo := 'XML';
EXCEPTION
WHEN OTHERS THEN
var_tipo := 'ERR';
end;
else
var_arq_sem_ext := 0;
var_tipo := upper(substr(cur_arq.file_name, -3, 3));
end if;
var_origem := upper(substr(cur_arq.file_name, 1, 44));
--apaga os registros duplicados
delete from TB_INFO_NFE where nome_arq = cur_arq.file_name;
commit;
if upper(var_tipo) = 'XML' then
begin
INSERT INTO TB_INFO_NFE
(ID, data_gravacao, nome_arq, tipo_arq, origem, CONTEUDO)
VALUES
(var_id,
SYSDATE,
cur_arq.file_name,
upper(var_tipo),
var_origem,
XMLTYPE(BFILENAME('XMLNFE', cur_arq.file_name),
NLS_CHARSET_ID('WE8ISO8859P1')));
EXCEPTION
WHEN OTHERS THEN
var_err_IO := 1;
end;
else
begin
INSERT INTO TB_INFO_NFE
(ID, data_gravacao, nome_arq, tipo_arq, origem, CONTEUDO)
VALUES
(var_id,
SYSDATE,
cur_arq.file_name,
upper(var_tipo),
var_origem,
null);
EXCEPTION
WHEN OTHERS THEN
var_err_IO := 1;
end;
end if;
COMMIT;
utl_file.fclose_all;
IF upper(var_tipo) = 'XML' THEN
--TRAZ OS VALORES DOS CAMPOS
BEGIN
SELECT nvl(to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/emit/CNPJ','xmlns="http://www.portalfiscal.inf.br/nfe"')),''),
nvl(to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/ide/nNF','xmlns="http://www.portalfiscal.inf.br/nfe"')),''),
to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/ide/dhEmi','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/total/ICMSTot/vNF','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(substr(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/@Id','xmlns="http://www.portalfiscal.inf.br/nfe"'),4)), --5
to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/emit/enderEmit/xMun','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/emit/xNome','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/dest/CNPJ','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/dest/enderDest/xMun','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/dest/xNome','xmlns="http://www.portalfiscal.inf.br/nfe"')), --10
to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/ide/natOp','xmlns="http://www.portalfiscal.inf.br/nfe"'))
INTO VAR_CNPJ, VAR_NUMERO, VAR_EMISSAO, VAR_TOTAL, VAR_CHAVE,VAR_CIDADE_EMI, VAR_RAZAO_EMI, VAR_CNPJ_DEST, VAR_CIDADE_DEST, VAR_RAZAO_DEST, VAR_NATUREZA
FROM TB_INFO_NFE
WHERE id = var_id;
EXCEPTION
WHEN OTHERS THEN
var_err_arq := 1;
end;
if (var_err_arq = 1) or (VAR_CNPJ = '') or (VAR_NUMERO = '') then
begin
SELECT to_char(extractvalue(CONTEUDO,'/NFe/infNFe/emit/CNPJ','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/NFe/infNFe/ide/nNF','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/NFe/infNFe/ide/dhEmi','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/NFe/infNFe/total/ICMSTot/vNF','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(substr(extractvalue(CONTEUDO,'/NFe/infNFe/@Id','xmlns="http://www.portalfiscal.inf.br/nfe"'),4)), --5
to_char(extractvalue(CONTEUDO,'/NFe/infNFe/emit/enderEmit/xMun','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/NFe/infNFe/emit/xNome','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/NFe/infNFe/dest/CNPJ','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/NFe/infNFe/dest/enderDest/xMun','xmlns="http://www.portalfiscal.inf.br/nfe"')),
to_char(extractvalue(CONTEUDO,'/NFe/infNFe/dest/xNome','xmlns="http://www.portalfiscal.inf.br/nfe"')), --10
to_char(extractvalue(CONTEUDO,'/NFe/infNFe/ide/natOp','xmlns="http://www.portalfiscal.inf.br/nfe"'))
INTO VAR_CNPJ, VAR_NUMERO, VAR_EMISSAO, VAR_TOTAL, VAR_CHAVE, VAR_CIDADE_EMI, VAR_RAZAO_EMI, VAR_CNPJ_DEST, VAR_CIDADE_DEST,VAR_RAZAO_DEST, VAR_NATUREZA
FROM TB_INFO_NFE
WHERE id = var_id;
var_err_arq := 0;
EXCEPTION
WHEN OTHERS THEN
var_err_arq := 1;
end;
end if;
if var_err_arq = 0 then
update TB_INFO_NFE
set num_nfe = VAR_NUMERO,
emissao = VAR_EMISSAO,
total_nf = VAR_TOTAL,
chave = VAR_CHAVE,
cnpj_emi = VAR_CNPJ,
cidade_emi = UPPER(VAR_CIDADE_EMI),
razao_emi = UPPER(VAR_RAZAO_EMI),
cnpj_dest = VAR_CNPJ_DEST,
cidade_dest = UPPER(VAR_CIDADE_DEST),
razao_dest = UPPER(VAR_RAZAO_DEST),
natureza = upper(VAR_NATUREZA)
where id = var_id;
commit;
end if;
BEGIN
if (var_err_IO = 1) or (var_err_arq = 1) then
utl_file.fremove('XMLNFE', cur_arq.file_name);
else
utl_file.fremove('XMLNFE', cur_arq.file_name);
end if;
EXCEPTION
WHEN OTHERS THEN
Dbms_Output.Put_Line('ERRO AO MOVIMENTAR O ARQUIVO');
utl_file.fclose_all;
end;
ELSE
utl_file.fremove('XMLNFE', cur_arq.file_name);
END IF;
end loop;
utl_file.fclose_all;
end;