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

DECLARE
   TYPE T_ID IS TABLE OF SIEBEL.S_LOY_ACRL_ITM.ROW_ID%TYPE;

   ARR_ID       T_ID;
   LOG_ROW_ID   NUMBER := 0;
   ROW_COUNT    NUMBER := 0;
   OK_TO_RUN    CHAR (1 CHAR) := 'N';

   CURSOR C1
   IS
        SELECT /*+ INDEX_FFS(A,TEMP_TXN_XPF_U1) PARALLEL_INDEX(A,TEMP_TXN_XPF_U1,10) PARALLEL(B,10) FULL(B) */
              B.ROW_ID
          FROM SIEBEL.S_LOY_ACRL_ITM B
               INNER JOIN SIEBEL_PURGE.TEMP_TXN_XPF A
                  ON A.TXN_ID = B.TXN_ID
         WHERE B.X_PURGE_FLG IS NULL
      ORDER BY B.ROWID;
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, 'Update S_LOY_ACRL_ITM XPF', SYSDATE
        FROM DUAL;

   COMMIT;

   SELECT OKAY_TO_RUN
     INTO OK_TO_RUN
     FROM SIEBEL_PURGE.PURGE_CONFIG
    WHERE ROW_ID = 1;

   IF (OK_TO_RUN = 'Y')
   THEN
      OPEN C1;

      LOOP
         FETCH C1 BULK COLLECT INTO ARR_ID LIMIT 40000;

         FORALL ROW IN ARR_ID.FIRST .. ARR_ID.LAST
            UPDATE SIEBEL.S_LOY_ACRL_ITM
               SET X_PURGE_FLG = 'Y'
             WHERE ROW_ID = ARR_ID (ROW);

         ROW_COUNT := ROW_COUNT + SQL%ROWCOUNT;

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

         COMMIT;

         SELECT OKAY_TO_RUN
           INTO OK_TO_RUN
           FROM SIEBEL_PURGE.PURGE_CONFIG
          WHERE ROW_ID = 1;

         EXIT WHEN OK_TO_RUN = 'N';
         EXIT WHEN C1%NOTFOUND;
      END LOOP;

      CLOSE C1;
   END IF;

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

   COMMIT;
END;
/

QUIT