--Author: Venkata Potluri
--Date: April 04, 2015

DECLARE
   TYPE T_MEM_ID IS TABLE OF SIEBEL_PURGE.PURGE_MEM_REDEEMABLE.MEMBER_ID%TYPE;

   TYPE T_MEM_NUM IS TABLE OF SIEBEL_PURGE.PURGE_MEM_REDEEMABLE.MEM_NUM%TYPE;

   TYPE T_AVL_PNTS
      IS TABLE OF SIEBEL_PURGE.PURGE_MEM_REDEEMABLE.MEM_AVAIL_POINTS%TYPE;

   ARR_MEM_ID     T_MEM_ID;
   ARR_MEM_NUM    T_MEM_NUM;
   ARR_AVL_PNTS   T_AVL_PNTS;
   LOG_ROW_ID     NUMBER := 0;
   ROW_COUNT      NUMBER := 0;

   CURSOR C1
   IS
      SELECT /*+ parallel(P,12) full(P) */ P.MEMBER_ID, P.MEM_NUM, M.POINT_TYPE_E_VAL
        FROM SIEBEL_PURGE.PURGE_MEM_TXN P
             INNER JOIN SIEBEL.S_LOY_MEMBER M ON P.MEMBER_ID = M.ROW_ID
       WHERE P.MEM_NUM IS NOT NULL;
BEGIN
   SELECT CASE WHEN MAX (ROW_ID) IS NOT NULL THEN MAX (ROW_ID) + 1 ELSE 1 END
     INTO LOG_ROW_ID
     FROM SIEBEL_PURGE.PURGE_LOG;

   INSERT INTO SIEBEL_PURGE.PURGE_LOG (ROW_ID, PROCESS_NAME, START_TIME)
      SELECT LOG_ROW_ID,
             'Populate PURGE_MEM_REDEEMABLE Part-1/4 Before Purge',
             SYSDATE
        FROM DUAL;

   COMMIT;

   OPEN C1;

   LOOP
      FETCH C1
         BULK COLLECT INTO ARR_MEM_ID, ARR_MEM_NUM, ARR_AVL_PNTS
         --LIMIT 10000;
		 LIMIT 50;

      FORALL ROW IN ARR_MEM_ID.FIRST .. ARR_MEM_ID.LAST
         INSERT
           INTO SIEBEL_PURGE.PURGE_MEM_REDEEMABLE (MEMBER_ID,
                                                   MEM_NUM,
                                                   MEM_AVAIL_POINTS)
         VALUES (ARR_MEM_ID (ROW), ARR_MEM_NUM (ROW), ARR_AVL_PNTS (ROW));

      ROW_COUNT := ROW_COUNT + SQL%ROWCOUNT;

      UPDATE SIEBEL_PURGE.PURGE_LOG
         SET PROCESSED_ROWS = ROW_COUNT
       WHERE ROW_ID = LOG_ROW_ID;

      COMMIT;

      EXIT WHEN C1%NOTFOUND;
   END LOOP;

   CLOSE C1;

   UPDATE SIEBEL_PURGE.PURGE_LOG
      SET END_TIME = SYSDATE, PROCESSED_ROWS = ROW_COUNT
    WHERE ROW_ID = LOG_ROW_ID;

   COMMIT;
END;
/

QUIT