CREATE OR REPLACE PROCEDURE CAD_AUT_RELACPRODOL  (P_CDPRODINIOL  IN VARCHAR2, /*Produto OL Inicial*/
                                                  P_CDPRODFINOL  IN VARCHAR2, /*Produto OL Final*/
                                                  P_OPERACAO     IN VARCHAR2, /*E = Exclusao e I = Inclusao*/
                                                  P_ERROS        OUT VARCHAR2, /*T = Nao ha dados e N = Concluido com Sucesso*/
                                                  P_CDPRODINI    IN VARCHAR2 DEFAULT NULL, /*NULL OU produto inicial*/
                                                  P_CDPRODFIN    IN VARCHAR2 DEFAULT NULL, /*NULL OU produto final*/
                                                  P_CDMARCA      IN VARCHAR2 DEFAULT NULL, /*NULL OU lista de marca ou T*/
                                                  P_CDFILIOPELOG IN VARCHAR2 DEFAULT NULL) /*A principio P*/
IS
   V_CONTADOR          NUMERIC := 0;
   V_CDGRUPPROD        PARASUPRI.CDGRUPPROD%TYPE;
   V_CDSUBGRARVOR      PARASUPRI.CDSUBGRARVOR%TYPE;
   V_IDUTLSUBGRPRODFIL PARASUPRI.IDUTLSUBGRPRODFIL%TYPE;
BEGIN
   P_ERROS := 'T';
   SELECT MAX(PARASUPRI.CDGRUPPROD), MAX(PARASUPRI.CDSUBGRARVOR), NVL(MAX(PARASUPRI.IDUTLSUBGRPRODFIL), 'N')
     INTO V_CDGRUPPROD, V_CDSUBGRARVOR, V_IDUTLSUBGRPRODFIL
     FROM PARASUPRI, FILIAL
    WHERE FILIAL.CDFILIAL    = P_CDFILIOPELOG
      AND PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL);
   IF P_OPERACAO = 'E' THEN
      FOR C_ITEM IN(SELECT RELACPRODOL.ROWID
                      FROM RELACPRODOL, PRODUTO
                     WHERE RELACPRODOL.CDPRODARVOL = PRODUTO.CDPRODUTO
                       AND PRODUTO.CDARVPROD BETWEEN P_CDPRODINIOL AND RPAD(P_CDPRODFINOL, 20, 'Z'))
      LOOP
         P_ERROS := 'N';
         V_CONTADOR := V_CONTADOR + 1;
         IF V_CONTADOR > 500 THEN
            V_CONTADOR := 0;
            COMMIT;
         END IF;
         DELETE
           FROM RELACPRODOL
          WHERE RELACPRODOL.ROWID = C_ITEM.ROWID;
      END LOOP;
   ELSE
      FOR C_ITEM IN
         (SELECT PRODUTO.CDPRODUTO CDPRODARVOL, P.CDPRODUTO CDPRARVORIG, MAX(M.CDMARCA) CDMARCA
            FROM MARCPRODCOMP M, PRODUTO P, PRSUBGRPROD PG, PRODUTO
           WHERE P.CDPRODUTO = M.CDPRMARCOMPL
             AND P.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z')
             AND PRODUTO.CDARVPROD BETWEEN P_CDPRODINIOL AND RPAD(P_CDPRODFINOL, 20, 'Z')
             AND PRODUTO.CDPRODESTO IS NOT NULL
             AND SUBSTR(P.CDARVPROD, 2)  = SUBSTR(PRODUTO.CDARVPROD, 2)
             AND (INSTR(P_CDMARCA, M.CDMARCA)> 0 OR (P_CDMARCA = 'T'))
             AND PG.CDGRUPPROD  = V_CDGRUPPROD
             AND PG.CDSUBGRPROD = V_CDSUBGRARVOR
             AND PG.CDFILISUBGR = CASE
                                     WHEN V_IDUTLSUBGRPRODFIL = 'N'
                                     THEN 'P'
                                     ELSE P_CDFILIOPELOG
                                  END
             AND PG.CDPRODUTO   = P.CDPRODUTO
             AND NOT EXISTS(SELECT 1
                              FROM RELACPRODOL
                             WHERE RELACPRODOL.CDPRODARVOL = PRODUTO.CDPRODUTO)
             AND NOT EXISTS(SELECT 1
                              FROM RELACPRODOL
                             WHERE RELACPRODOL.CDPRARVORIG = P.CDPRODUTO
                               AND RELACPRODOL.CDMARCA     = M.CDMARCA)
           GROUP BY PRODUTO.CDPRODUTO, P.CDPRODUTO
           ORDER BY PRODUTO.CDPRODUTO)
      LOOP
         P_ERROS := 'N';
         V_CONTADOR := V_CONTADOR + 1;
         IF V_CONTADOR > 500 THEN
            V_CONTADOR := 0;
            COMMIT;
         END IF;
         INSERT
           INTO RELACPRODOL(CDPRODARVOL, CDPRARVORIG, CDMARCA)
         VALUES (C_ITEM.CDPRODARVOL, C_ITEM.CDPRARVORIG, C_ITEM.CDMARCA);
      END LOOP;
   END IF;
   COMMIT;
END;
/