create or replace PROCEDURE GRAVA_ITDESPREBASE(
   P_CDPRECOBASE  IN VARCHAR2,
   P_CDPAIS       IN ITDESPREBASE.CDPAIS%TYPE,
   P_LISTAESTADO  IN VARCHAR2,
   P_VRPEMAXDESPR IN ITDESPREBASE.VRPEMAXDESPR%TYPE,
   P_CDPRODINI    IN PRODUTO.CDARVPROD%TYPE,
   P_CDPRODFIN    IN PRODUTO.CDARVPROD%TYPE,
   P_IDTRATADESC  IN PEDIDO.IDSITPEDIDO%TYPE
) IS

    TYPE TYP_REGISTROS IS RECORD (
        CDPRECOBASE  ITDESPREBASE.CDPRECOBASE%TYPE,
        CDPAIS       ITDESPREBASE.CDPAIS%TYPE, 
        SGESTADO     ITDESPREBASE.SGESTADO%TYPE, 
        CDPRODUTO    ITDESPREBASE.CDPRODUTO%TYPE, 
        VRPEMAXDESPR ITDESPREBASE.VRPEMAXDESPR%TYPE
    );

   TYPE TYP_TABLE IS TABLE OF TYP_REGISTROS INDEX BY PLS_INTEGER; 
   AR_INSERT TYP_TABLE;
   AR_UPDATE TYP_TABLE;
   
   V_IDINSERT NUMBER := 0;
   V_IDUPDATE NUMBER := 0;
   V_CTPROD   NUMBER;
   T0         NUMBER := DBMS_UTILITY.GET_TIME;
BEGIN
  
   FOR C_EST IN
      (SELECT SGESTADO
       FROM ESTADO
       WHERE (CDPAIS = P_CDPAIS)
         AND ((INSTR(P_LISTAESTADO, SGESTADO) <> 0)OR( P_LISTAESTADO = 'T'))
       ORDER BY SGESTADO) LOOP

      FOR C_PROD IN
         (SELECT CDPRODUTO
          FROM PRODUTO
          WHERE CDARVPROD BETWEEN P_CDPRODINI AND P_CDPRODFIN
            AND CDPRODESTO IS NOT NULL
          ORDER BY CDARVPROD) LOOP
          
         FOR C_ITDESPREBASE IN
             (SELECT CDPRECOBASE 
                FROM PRECOBASE
               WHERE ((INSTR(P_CDPRECOBASE, CDPRECOBASE) <> 0)OR( P_CDPRECOBASE = 'T'))
             )LOOP
             
             SELECT COUNT(CDPRODUTO) INTO V_CTPROD
             FROM ITDESPREBASE
             WHERE CDPRECOBASE = C_ITDESPREBASE.CDPRECOBASE
               AND CDPAIS      = P_CDPAIS
               AND SGESTADO    = C_EST.SGESTADO
               AND CDPRODUTO   = C_PROD.CDPRODUTO;

             IF (V_CTPROD > 0) THEN
             
                IF (P_IDTRATADESC = 'S') THEN
                    
                    AR_UPDATE(V_IDUPDATE).CDPRECOBASE  := C_ITDESPREBASE.CDPRECOBASE; 
                    AR_UPDATE(V_IDUPDATE).CDPAIS       := P_CDPAIS;
                    AR_UPDATE(V_IDUPDATE).SGESTADO     := C_EST.SGESTADO;
                    AR_UPDATE(V_IDUPDATE).CDPRODUTO    := C_PROD.CDPRODUTO; 
                    AR_UPDATE(V_IDUPDATE).VRPEMAXDESPR := P_VRPEMAXDESPR;
                    
                    V_IDUPDATE := V_IDUPDATE + 1;
                    
                    IF ( MOD(V_IDUPDATE, 10000) = 0 ) THEN
                    
                        FORALL U IN AR_UPDATE.FIRST..AR_UPDATE.LAST
                        UPDATE ITDESPREBASE
                           SET VRPEMAXDESPR = AR_UPDATE(U).VRPEMAXDESPR
                         WHERE CDPRECOBASE  = AR_UPDATE(U).CDPRECOBASE
                           AND CDPAIS       = AR_UPDATE(U).CDPAIS
                           AND SGESTADO     = AR_UPDATE(U).SGESTADO
                           AND CDPRODUTO    = AR_UPDATE(U).CDPRODUTO;
                        AR_UPDATE.DELETE; 
                        V_IDUPDATE := 1;
                    END IF;    
                END IF;
             ELSE
                AR_INSERT(V_IDINSERT).CDPRECOBASE  := C_ITDESPREBASE.CDPRECOBASE; 
                AR_INSERT(V_IDINSERT).CDPAIS       := P_CDPAIS;
                AR_INSERT(V_IDINSERT).SGESTADO     := C_EST.SGESTADO;
                AR_INSERT(V_IDINSERT).CDPRODUTO    := C_PROD.CDPRODUTO; 
                AR_INSERT(V_IDINSERT).VRPEMAXDESPR := P_VRPEMAXDESPR;
                
                V_IDINSERT := V_IDINSERT + 1;
                
                IF ( MOD(V_IDINSERT, 10000) = 0 ) THEN 
                    FORALL I IN AR_INSERT.FIRST..AR_INSERT.LAST 
                    INSERT INTO ITDESPREBASE
                       (CDPRECOBASE, CDPAIS, SGESTADO, CDPRODUTO, VRPEMAXDESPR)
                    VALUES
                       (AR_INSERT(I).CDPRECOBASE, AR_INSERT(I).CDPAIS, AR_INSERT(I).SGESTADO, AR_INSERT(I).CDPRODUTO, AR_INSERT(I).VRPEMAXDESPR);
                                   
                    AR_INSERT.DELETE; 
                    V_IDINSERT := 1;                                       
                END IF;
             END IF;
         END LOOP;
      END LOOP;
   END LOOP;
   
   FORALL U IN AR_UPDATE.FIRST..AR_UPDATE.LAST
   UPDATE ITDESPREBASE
      SET VRPEMAXDESPR = AR_UPDATE(U).VRPEMAXDESPR
    WHERE CDPRECOBASE  = AR_UPDATE(U).CDPRECOBASE
      AND CDPAIS       = AR_UPDATE(U).CDPAIS
      AND SGESTADO     = AR_UPDATE(U).SGESTADO
      AND CDPRODUTO    = AR_UPDATE(U).CDPRODUTO;
       
   FORALL I IN AR_INSERT.FIRST..AR_INSERT.LAST 
   INSERT INTO ITDESPREBASE
       (CDPRECOBASE, CDPAIS, SGESTADO, CDPRODUTO, VRPEMAXDESPR)
   VALUES
       (AR_INSERT(I).CDPRECOBASE, AR_INSERT(I).CDPAIS, AR_INSERT(I).SGESTADO, AR_INSERT(I).CDPRODUTO, AR_INSERT(I).VRPEMAXDESPR);
                                   
   AR_INSERT.DELETE;     
   AR_UPDATE.DELETE;
   --DBMS_OUTPUT.PUT_LINE('Tempo: ' || ((DBMS_UTILITY.GET_TIME - T0) / 100) || ' segundos'); 
END;
/
