CREATE OR REPLACE PROCEDURE EXPORTA_PRODUTO_XML
IS
   V_XML XMLTYPE;
   V_CDNVPRODUTO  VARCHAR2(1);
   V_CDPRODUTOINI VARCHAR2(20);
   V_CDPRODUTOMAX VARCHAR2(20);
   V_CDPRODUTO    VARCHAR2(10);
   
   BO_PRODUTO     BOOLEAN;
   V_CONT         INTEGER;
   
   CURSOR C_PRODUTO(C_ARVPRODINI IN VARCHAR2, C_ARVPRODFIN IN VARCHAR2, C_CDNVPRODUTO IN VARCHAR2) IS
      SELECT CDPRODUTO
        FROM PRODUTO
       WHERE CDARVPROD BETWEEN C_ARVPRODINI AND C_ARVPRODFIN
         AND CDNVPRODUTO = C_CDNVPRODUTO;
BEGIN
   BO_PRODUTO := TRUE;
   
   SELECT MAX(CDNVPRODUTO) CDNVPRODUTO
     INTO V_CDNVPRODUTO
     FROM PRODUTO;
   
   WHILE BO_PRODUTO LOOP
      SELECT COUNT(1)
        INTO V_CONT
        FROM PRODUTO
       WHERE CDNVPRODUTO = V_CDNVPRODUTO
         AND SYSTAX_DTEXPXML IS NULL;
      
      BO_PRODUTO := V_CONT > 0;
      
      SELECT MIN(CDARVPROD), MAX(CDARVPROD)
        INTO V_CDPRODUTOINI, V_CDPRODUTOMAX
        FROM (SELECT CDARVPROD
                FROM PRODUTO
               WHERE CDNVPRODUTO = V_CDNVPRODUTO
                 AND SYSTAX_DTEXPXML IS NULL
               ORDER BY NLSSORT(CDARVPROD, 'NLS_SORT=BINARY'))
       WHERE ROWNUM <= 15;
      
      V_XML := EXPORTA_PRODUTO_SYSTAX(V_CDPRODUTOINI, V_CDPRODUTOMAX, V_CDNVPRODUTO);
      
      INSERT INTO ENVIA_PROD_XML(CDPRODUTOINI, CDPRODUTOFIN, ARQ_XML)
      VALUES(V_CDPRODUTOINI, V_CDPRODUTOMAX, V_XML.GetStringVal());
      
      OPEN C_PRODUTO(V_CDPRODUTOINI, V_CDPRODUTOMAX, V_CDNVPRODUTO);
      LOOP
         FETCH C_PRODUTO INTO V_CDPRODUTO;
         EXIT WHEN C_PRODUTO%NOTFOUND;
         
         UPDATE PRODUTO
            SET SYSTAX_DTEXPXML = SYSDATE
          WHERE CDPRODUTO = V_CDPRODUTO;
      END LOOP;
      CLOSE C_PRODUTO;
      
      COMMIT;
   END LOOP;
EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      RAISE;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('EXPORTA_PRODUTO_XML','6.29.022'); END;
/
