como ler e gravar dados de um xml de nota fiscal no Oracle

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
alextdssouza
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 26 Set 2018 4:50 pm

Gostaria de saber como faço para criar uma precedure para importar as informações
das notas fiscais eletronicas em xml no Banco Oracle. Agradeço quem disponibilizar.
Jisaias
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Qui, 20 Set 2018 11:05 am

Criei essa procedure para salvar em XML os dados de um Pedido de Compra e disponibilizá-lo para ser consumido por um WebService. Nesse caso é um Pedido de Compra mas pode-se aplicar também para uma Nota Fiscal. Atente-se às colunas envolvidas na sua Nota Fiscal e como montar o XML usando essa proc.
A procedure envolve também a criação de três cursores para controlar a montagem do cabeçalho, dos detalhes das linhas do pedido e o número desse pedido. E depois salva esse XML em uma coluna de uma tabela criada com essa intenção.
Espero poder ajudar em algo.

Selecionar tudo


CREATE OR REPLACE PROCEDURE imp_prc_ws_xml_po_edi_renner ( pn_po_id NUMBER
                                                         , pn_retorno IN OUT NUMBER
                                                         ) IS

	CURSOR cur_po_header IS
		SELECT XMLConcat( XMLForest( header.po_numero  AS "PO_NUMERO"
			                         , header.status     AS "STATUS"
			                         , ent.codigo        AS "FORNECEC_CODIGO"
			                         , ent.nome          AS "FORNEC_NOME"
			                         , header.atributo3  AS "GRUPO")
                    )
		  FROM imp_po_dge_erp header
         , imp_entidades ent
		 WHERE header.po_id =  pn_po_id
       AND header.fornec_codigo = ent.codigo(+)
       AND header.release_num = ( SELECT Max(x.release_num)
	                              	  FROM imp_po_dge_erp x
		                               WHERE x.po_id = header.po_id);

  CURSOR cur_po_linhas(pc_po_numero VARCHAR2) IS
    SELECT XMLAgg( XMLElement( "IMP_PEDIDO_LINHA"
                              , XMLConcat( XMLForest( linha.item_codigo                        AS "ITEM_CODIGO"
			                                              , linha.qtde                               AS "QTDE"
			                                              , linha.class_fiscal_codigo                AS "CLASS_FISCAL"
			                                              , To_Char(entr.dt_prometida, 'DD/MM/RRRR') AS "DT_PROMETIDA")
                    )))
      FROM imp_po_lin_erp linha
         , imp_po_lin_entr_erp entr
     WHERE linha.po_numero = pc_po_numero
       AND linha.po_numero = entr.po_numero(+)
       AND linha.linha_num = entr.po_linha_numero
       AND linha.release_num = ( SELECT Max(x.release_num)
                                	  FROM imp_po_lin_erp x
	 	                               WHERE x.po_numero = linha.po_numero
                                     AND x.linha_num = linha.linha_num)
  ORDER BY linha.linha_num;

  CURSOR cur_po_numero IS
		SELECT header.po_numero
		  FROM imp_po_dge_erp header
		 WHERE header.po_id = pn_po_id;

  vx_header    xmltype;
  vx_line      xmltype;
  vx_concat    xmltype;
  você_po_numero imp_po_dge_erp.po_numero%TYPE;
  você_step      VARCHAR2(150);

BEGIN

	você_step := 'OPEN cursor [cur_po_header]';
  OPEN  cur_po_header;
  FETCH cur_po_header INTO vx_header;
  CLOSE cur_po_header;

  você_step := 'OPEN cursor [cur_po_numero]';
  OPEN  cur_po_numero;
  FETCH cur_po_numero INTO você_po_numero;
  CLOSE cur_po_numero;

  você_step := 'OPEN cursor [cur_po_linhas]';
  OPEN  cur_po_linhas(você_po_numero);
  FETCH cur_po_linhas INTO vx_line;
  CLOSE cur_po_linhas;

  você_step := 'Montando XML pedidos';
  SELECT XMLElement( "IMP_PEDIDOS"
                       , XMLConcat(
                                    vx_header
                                  , vx_line
                                  )
                   )
    INTO vx_concat
    FROM dual;

  você_step := 'Inserindo registro [cmx_ws_edi]';
	INSERT INTO cmx_ws_edi
            ( edi_id
            , message_type
	  				, xml
	  				, chave
	  				, cnpj_agente
	  				, status
	  				, creation_date
	  				)
	  	 VALUES
            ( cmx_ws_edi_sq1.NEXTVAL
            , 'IMP_PO'
	  				, vx_concat
	  				, você_po_numero
	  				, NULL
	  				, 0
	  				, SYSDATE
	  				);

EXCEPTION
  WHEN OTHERS THEN
     pn_retorno := 2;
    raise_application_error (-20000, 'Step [' || você_step || '] erro: ' || SQLERRM);
END;

Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes