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
  

Mensagemem Qua, 26 Set 2018 5:11 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.
alextdssouza

Mensagemem Ter, 06 Nov 2018 3:42 pm

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.

Código: Selecionar todos

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;
  vc_po_numero imp_po_dge_erp.po_numero%TYPE;
  vc_step      VARCHAR2(150);

BEGIN

   vc_step := 'OPEN cursor [cur_po_header]';
  OPEN  cur_po_header;
  FETCH cur_po_header INTO vx_header;
  CLOSE cur_po_header;

  vc_step := 'OPEN cursor [cur_po_numero]';
  OPEN  cur_po_numero;
  FETCH cur_po_numero INTO vc_po_numero;
  CLOSE cur_po_numero;

  vc_step := 'OPEN cursor [cur_po_linhas]';
  OPEN  cur_po_linhas(vc_po_numero);
  FETCH cur_po_linhas INTO vx_line;
  CLOSE cur_po_linhas;

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

  vc_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
                 , vc_po_numero
                 , NULL
                 , 0
                 , SYSDATE
                 );

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

Jisaias



Voltar para PL/SQL

Quem está online

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