Re: BULK COLLECT - Can it be implemented for a few rows .
Date: 6 Dec 2005 09:30:01 -0800
Message-ID: <1133890200.999990.183310_at_g49g2000cwa.googlegroups.com>
Hi Daniel
This is my old procedure :-
[Quoted] ORACLE 9i is the version number of oracle we are using.
This old proc was the one implemented using a lot of CURSORS . Though
it was very efficient the data base reads was very high as told by the
STATS PACK REPORT . So we designed a NEW PROC using BULK COLLECT .
CREATE OR REPLACE PROCEDURE JP_CASE_HISTORY_INC_OLD AS
VTRANSACTION_FLAG VARCHAR2(2);
VASSIGNED_TO VARCHAR2(50);
VASSIGNED_TO_PG VARCHAR2(50);
VSTATUS VARCHAR(50);
VASSIGNED_TO_OLD VARCHAR2(50);
VASSIGNED_TO_PG_OLD VARCHAR2(50);
VSTATUS_OLD VARCHAR(50);
VASSIGNED_TO_FLAG VARCHAR2(2);
VASSIGNED_TO_PG_FLAG VARCHAR2(2);
VSTATUS_FLAG VARCHAR(2);
VCTR NUMBER(2);
CURSOR CUR1(LASTRUN DATE) IS SELECT DISTINCT CASE_ID FROM
PS_RC_ACTION_HIST WHERE
ROW_LASTMANT_DTTM > LASTRUN ;
CURSOR CUR2(VCASE_ID NUMBER,LASTRUN DATE) IS SELECT DISTINCT
ROW_LASTMANT_DTTM,ROW_LASTMANT_OPRID FROM
PS_RC_ACTION_HIST WHERE
CASE_ID = VCASE_ID
AND
EVENTNAME IN
('AssignedToChanged','AssignedToProviderGroup','AssignedToProviderGroupChanged','JP_AssignedToProviderGroupAdd','Status
Changed')
AND
ROW_LASTMANT_DTTM > LASTRUN
ORDER BY ROW_LASTMANT_DTTM ,ROW_LASTMANT_OPRID ;
CURSOR CUR3(VCASE_ID NUMBER,VROW_LASTMANT_DTTM DATE,VROW_LASTMANT_OPRID
VARCHAR2)
IS SELECT EVENTNAME, NEW_VALUE,OLD_VALUE,DESCR100 FROM
PS_RC_ACTION_HIST
WHERE CASE_ID = VCASE_ID AND ROW_LASTMANT_DTTM = VROW_LASTMANT_DTTM
AND ROW_LASTMANT_OPRID = VROW_LASTMANT_OPRID AND EVENTNAME IN
('AssignedToChanged','AssignedToProviderGroup','AssignedToProviderGroupChanged','JP_AssignedToProviderGroupAdd','Status
Changed');
CURSOR CUR4(NCASE_ID NUMBER) IS SELECT
A.ASSIGNED_TO_OLD,A.ASSIGNED_TO_NEW,A.ASSIGNED_TO_PG_OLD,
A.ASSIGNED_TO_PG_NEW,A.STATUS_OLD, A.STATUS_NEW, A.ROW_LASTMANT_DTTM AS
"LDTTM"
FROM JP_HISTORY_TBL_OLD A WHERE A.CASE_ID = NCASE_ID AND
A.ROW_LASTMANT_DTTM =
(SELECT MAX(B.ROW_LASTMANT_DTTM) FROM JP_HISTORY_TBL_OLD B WHERE
A.CASE_ID = B.CASE_ID);
CURSOR CUR5 IS SELECT
DECODE(TRIM(MAX(ROW_LASTMANT_DTTM)),Null,to_date('01-Jan-1900
00:00:00','dd-Mon-YYYY HH24:MI:SS'), MAX(ROW_LASTMANT_DTTM))
AS "DTTM" FROM JP_HISTORY_TBL_OLD;
CURSOR CUR6(NCASE_ID NUMBER, VROW_LASTMANT_DTTM DATE) IS
SELECT /*+ FIRST_ROWS */ ROUND(( DECODE(TRIM((SELECT
MIN(B.ROW_LASTMANT_DTTM)FROM JP_HISTORY_TBL_OLD B WHERE A.CASE_ID =
B.CASE_ID
AND B.ROW_LASTMANT_DTTM > A.ROW_LASTMANT_DTTM)),NULL,SYSDATE,(SELECT
MIN(B.ROW_LASTMANT_DTTM)FROM
JP_HISTORY_TBL_OLD B WHERE A.CASE_ID = B.CASE_ID AND
B.ROW_LASTMANT_DTTM > A.ROW_LASTMANT_DTTM)) - A.ROW_LASTMANT_DTTM )
*(24 *60),2)
AS "DURATION" FROM JP_HISTORY_TBL_OLD A WHERE A.CASE_ID = NCASE_ID
AND A.ROW_LASTMANT_DTTM = VROW_LASTMANT_DTTM;
CURSOR CUR7 IS SELECT /*+ FIRST_ROWS */ CASE_ID, ROW_LASTMANT_DTTM FROM
JP_HISTORY_TBL_OLD WHERE DURATION = 0 ORDER BY CASE_ID,
ROW_LASTMANT_DTTM;
CURSOR CUR8(NCASE_ID NUMBER) IS SELECT /*+ FIRST_ROWS */
JP_ORIG_PRVDR_GRP, PERSON_ID FROM PS_RC_CASE RC, PSOPRALIAS OP
WHERE RC.ROW_ADDED_OPRID = OP.OPRID AND OP.OPRALIASTYPE = 'PER' AND
RC.CASE_ID = NCASE_ID;
CUR8_VAR CUR8%ROWTYPE; CUR4_VAL CUR4%ROWTYPE; CUR5_VAL CUR5%ROWTYPE;
BEGIN
INSERT INTO JP_REFRESH_ACTION VALUES('REPDB',SYSDATE);
COMMIT;
OPEN CUR5;
FETCH CUR5 INTO CUR5_VAL;
--DBMS_OUTPUT.PUT_LINE(CUR5_VAL.DTTM);
FOR I IN CUR1(CUR5_VAL.DTTM) LOOP
OPEN CUR4(I.CASE_ID);
FETCH CUR4 INTO CUR4_VAL;
IF CUR4%NOTFOUND THEN
OPEN CUR8(I.CASE_ID);
FETCH CUR8 INTO CUR8_VAR;
VCTR :=0;
VASSIGNED_TO_OLD := CUR8_VAR.PERSON_ID;
VASSIGNED_TO_PG_OLD := CUR8_VAR.JP_ORIG_PRVDR_GRP;
VSTATUS_OLD := ' ';
VASSIGNED_TO := ' ';
VASSIGNED_TO_PG := ' ';
VSTATUS := ' ';
VTRANSACTION_FLAG := 'A';
CLOSE CUR8;
ELSE
VCTR :=1;
VASSIGNED_TO_OLD := CUR4_VAL.ASSIGNED_TO_OLD;
VASSIGNED_TO_PG_OLD := CUR4_VAL.ASSIGNED_TO_PG_OLD;
VSTATUS_OLD := CUR4_VAL.STATUS_OLD;
VASSIGNED_TO := CUR4_VAL.ASSIGNED_TO_NEW;
VASSIGNED_TO_PG := CUR4_VAL.ASSIGNED_TO_PG_NEW ;
VSTATUS := CUR4_VAL.STATUS_NEW;
VTRANSACTION_FLAG := 'C';
UPDATE JP_HISTORY_TBL_OLD SET DURATION = 0 WHERE CASE_ID = I.CASE_ID
AND ROW_LASTMANT_DTTM = CUR4_VAL.LDTTM;
COMMIT;
END IF;
close CUR4;
FOR J IN CUR2(I.CASE_ID,CUR5_VAL.DTTM) LOOP
VASSIGNED_TO_FLAG := 'N';
VASSIGNED_TO_PG_FLAG := 'N';
VSTATUS_FLAG := 'N';
FOR K IN CUR3(I.CASE_ID,J.ROW_LASTMANT_DTTM,J.ROW_LASTMANT_OPRID) LOOP
--dbms_output.put_line(k.eventname);
IF VCTR = 0 THEN
VCTR := 1;
VASSIGNED_TO_FLAG := 'Y';
VASSIGNED_TO_PG_FLAG := 'Y';
VSTATUS_FLAG := 'Y';
END IF;
IF ( K.EVENTNAME = 'AssignedToChanged' AND UPPER(K.DESCR100) NOT LIKE
'%WORK%') THEN
VASSIGNED_TO_FLAG := 'Y';
VASSIGNED_TO := K.NEW_VALUE;
IF VTRANSACTION_FLAG <> 'A' THEN
VASSIGNED_TO_OLD := K.OLD_VALUE;
END IF;
END IF;
IF ((K.EVENTNAME = 'AssignedToProviderGroup' OR K.EVENTNAME =
'AssignedToProviderGroupChanged' OR K.EVENTNAME =
'JP_AssignedToProviderGroupAdd')
AND UPPER(K.DESCR100) NOT LIKE '%WORK%' )
THEN
VASSIGNED_TO_PG_FLAG := 'Y';
VASSIGNED_TO_PG := K.NEW_VALUE;
IF VTRANSACTION_FLAG <> 'A' THEN
VASSIGNED_TO_PG_OLD := K.OLD_VALUE;
END IF;
END IF;
IF K.EVENTNAME = 'Status Changed' THEN
VSTATUS_FLAG := 'Y';
VSTATUS := K.NEW_VALUE ;
VSTATUS_OLD := K.OLD_VALUE;
END IF;
END LOOP ;
IF (VASSIGNED_TO_FLAG ='Y' OR VASSIGNED_TO_PG_FLAG = 'Y' OR
VSTATUS_FLAG = 'Y')
THEN
INSERT INTO JP_HISTORY_TBL_OLD
VALUES(I.CASE_ID,J.ROW_LASTMANT_OPRID,J.ROW_LASTMANT_DTTM,VASSIGNED_TO_OLD
,VASSIGNED_TO,VASSIGNED_TO_PG_OLD ,VASSIGNED_TO_PG,
VSTATUS_OLD,VSTATUS,VASSIGNED_TO_FLAG,VASSIGNED_TO_PG_FLAG,VSTATUS_FLAG,VTRANSACTION_FLAG,0);
VTRANSACTION_FLAG := 'C';
END IF;
END LOOP;
COMMIT;
END LOOP;
CLOSE CUR5;
FOR K IN CUR7 LOOP
FOR L IN CUR6(K.CASE_ID, K.ROW_LASTMANT_DTTM) LOOP UPDATE /*+ APPEND */ JP_HISTORY_TBL_OLD NOLOGGING SET DURATION = L.DURATION WHERE CASE_ID = K.CASE_ID AND ROW_LASTMANT_DTTM = K.ROW_LASTMANT_DTTM; END LOOP;
END LOOP; COMMIT; UPDATE JP_HISTORY_TBL_OLD
SET ASSIGNED_TO_PG_OLD = ASSIGNED_TO_PG_NEW WHERE ASSIGNED_TO_PG_FLAG = 'N'; UPDATE JP_HISTORY_TBL_OLD
SET ASSIGNED_TO_OLD = ASSIGNED_TO_NEW
WHERE ASSIGNED_TO_FLAG = 'N'; UPDATE JP_HISTORY_TBL_OLD
SET STATUS_OLD = STATUS_NEW
WHERE STATUS_FLAG = 'N'; UPDATE JP_HISTORY_TBL_OLD
SET ASSIGNED_TO_PG_OLD = ' '
WHERE ASSIGNED_TO_PG_OLD IS NULL ; UPDATE JP_HISTORY_TBL_OLD
SET ASSIGNED_TO_PG_NEW = ' '
WHERE ASSIGNED_TO_PG_NEW IS NULL ; UPDATE JP_HISTORY_TBL_OLD
SET ASSIGNED_TO_NEW = ' '
WHERE ASSIGNED_TO_NEW IS NULL ; UPDATE JP_HISTORY_TBL_OLD
SET ASSIGNED_TO_OLD = ' '
WHERE ASSIGNED_TO_OLD IS NULL ; UPDATE JP_HISTORY_TBL_OLD
SET STATUS_NEW = ' '
WHERE STATUS_NEW IS NULL ; UPDATE JP_HISTORY_TBL_OLD
SET STATUS_OLD = ' '
WHERE STATUS_OLD IS NULL ; COMMIT; INSERT INTO JP_REFRESH_ACTION VALUES('REPDB',SYSDATE); COMMIT; END;
/
[Quoted] The new procedure using BULK COLLECT does the same functionality
CREATE OR REPLACE PROCEDURE JP_CASE_HISTORY_INCREMENTAL AS
TYPE CASEIDTYP IS TABLE OF SYSADM.PS_RC_ACTION_HIST.CASE_ID%TYPE;
ORG_CASEIDVAL CASEIDTYP;
TYPE MANTDTTMTYP IS TABLE OF
SYSADM.PS_RC_ACTION_HIST.ROW_LASTMANT_DTTM%TYPE;
TYPE EVNTTYP IS TABLE OF SYSADM.PS_RC_ACTION_HIST.EVENTNAME%TYPE;
TYPE OLDVALTYP IS TABLE OF SYSADM.PS_RC_ACTION_HIST.OLD_VALUE%TYPE;
TYPE NEWVALTYP IS TABLE OF SYSADM.PS_RC_ACTION_HIST.NEW_VALUE%TYPE;
TYPE MANTOPRIDTYP IS TABLE OF
SYSADM.PS_RC_ACTION_HIST.ROW_LASTMANT_OPRID%TYPE;
TYPE HISTORY_TBL IS TABLE OF SYSADM.JP_HISTORY_TBL%ROWTYPE;
TYPE HISTORY_CASE_ID IS TABLE OF SYSADM.JP_HISTORY_TBL.CASE_ID%TYPE
INDEX BY BINARY_INTEGER;
TYPE HISTORY_DATE IS TABLE OF DATE INDEX BY BINARY_INTEGER;
TYPE HISTORY_DUR IS TABLE OF SYSADM.JP_HISTORY_TBL.DURATION%TYPE INDEX
BY BINARY_INTEGER;
HISTORY_SEL HISTORY_TBL :=HISTORY_TBL() ; HISTORY_LAST_ROW HISTORY_TBL:=HISTORY_TBL() ; HISTORY_PREV_ROW HISTORY_TBL:=HISTORY_TBL() ; HISTORY_DATE_ROW HISTORY_DATE; HISTORY_CASE_ID_ROW HISTORY_CASE_ID; UPD_HIS_CASE_ID_ROW HISTORY_CASE_ID; UPD_HIS_DUR HISTORY_DUR; UPD_HIS_DATE_ROW HISTORY_DATE;
CLO_DTTM DATE;
ORG_CREPG OLDVALTYP; ORG_CREATOR OLDVALTYP; ACT_CASEIDVAL CASEIDTYP; ACT_MANTDTTMVAL MANTDTTMTYP; ACT_EVNTVAL EVNTTYP; ACT_OLDVAL OLDVALTYP; ACT_NEWVAL NEWVALTYP; ACT_OPRIDVAL MANTOPRIDTYP;
PREV_CASEID NUMBER(15); PREV_DATE DATE;
CURR_DATE DATE;
MAX_DATE DATE;
VASSIGNED_TO VARCHAR2(50);
VASSIGNED_TO_PG VARCHAR2(50);
VSTATUS VARCHAR(50);
VASSIGNED_TO_OLD VARCHAR2(50);
VASSIGNED_TO_PG_OLD VARCHAR2(50);
VSTATUS_OLD VARCHAR(50);
VASSIGNED_TO_FLAG VARCHAR2(2);
VASSIGNED_TO_PG_FLAG VARCHAR2(2);
VSTATUS_FLAG VARCHAR(2);
CURROW NUMBER(5);
CREROW NUMBER(10);
ASSIGN_FLAG BOOLEAN; BULK_ERRORS EXCEPTION;
PRAGMA EXCEPTION_INIT(BULK_ERRORS,-24381); ERRORS_COUNT NUMBER; BEGIN CURR_DATE := SYSDATE; SELECT
DECODE(TRIM(MAX(ROW_LASTMANT_DTTM)),NULL,TO_DATE('01-Jan-1900 00:00:00','dd-Mon-YYYY HH24:MI:SS'),
MAX(ROW_LASTMANT_DTTM)) INTO MAX_DATE
FROM SYSADM.JP_HISTORY_TBL; SELECT CASE_ID , ROW_LASTMANT_DTTM ,EVENTNAME,OLD_VALUE, NEW_VALUE , ROW_LASTMANT_OPRID
BULK COLLECT INTO
ACT_CASEIDVAL , ACT_MANTDTTMVAL, ACT_EVNTVAL, ACT_OLDVAL, ACT_NEWVAL, ACT_OPRIDVAL
FROM SYSADM.PS_RC_ACTION_HIST WHERE EVENTNAME IN
('AssignedToChanged','AssignedToProviderGroup','AssignedToProviderGroupChanged','JP_AssignedToProviderGroupAdd',
'Status Changed') AND UPPER(DESCR100) NOT LIKE '%WORK%' AND ROW_LASTMANT_DTTM > MAX_DATE AND
ROW_LASTMANT_DTTM < CURR_DATE
ORDER BY CASE_ID, ROW_LASTMANT_DTTM, EVENTNAME; SELECT A.CASE_ID, A.ROW_LASTMANT_DTTM
BULK COLLECT INTO HISTORY_CASE_ID_ROW, HISTORY_DATE_ROW FROM
SYSADM.JP_HISTORY_TBL A WHERE
A.ROW_LASTMANT_DTTM = (SELECT MAX(A1.ROW_LASTMANT_DTTM) FROM SYSADM.JP_HISTORY_TBL A1
WHERE A.CASE_ID = A1.CASE_ID)
AND
A.STATUS_NEW NOT IN ('Cancelled','Closed');
SELECT RC.CASE_ID, RC.JP_ORIG_PRVDR_GRP, OP.PERSON_ID
BULK COLLECT INTO ORG_CASEIDVAL,ORG_CREPG,ORG_CREATOR
FROM SYSADM.PS_RC_CASE RC, SYSADM.PSOPRALIAS OP
WHERE RC.ROW_ADDED_OPRID = OP.OPRID AND OP.OPRALIASTYPE = 'PER' AND
RC.ROW_ADDED_DTTM > MAX_DATE
AND RC.ROW_ADDED_DTTM < CURR_DATE ORDER BY RC.CASE_ID;
SELECT
A.CASE_ID,A.ROW_LASTMANT_OPRID,A.ROW_LASTMANT_DTTM,A.ASSIGNED_TO_OLD,A.ASSIGNED_TO_NEW, A.ASSIGNED_TO_PG_OLD,A.ASSIGNED_TO_PG_NEW,A.STATUS_OLD,A.STATUS_NEW,A.ASSIGNED_TO_FLAG, A.ASSIGNED_TO_PG_FLAG,A.STATUS_FLAG,A.TRANSACTION_FLAG,A.DURATION,A.SYNC_DTTMBULK COLLECT INTO HISTORY_PREV_ROW
FROM SYSADM.JP_HISTORY_TBL A
WHERE
A.CASE_ID IN (SELECT CASE_ID
FROM SYSADM.PS_RC_ACTION_HIST WHERE
EVENTNAME IN
('AssignedToChanged','AssignedToProviderGroup','AssignedToProviderGroupChanged','JP_AssignedToProviderGroupAdd','Status
Changed')
AND UPPER(DESCR100) NOT LIKE '%WORK%' AND ROW_LASTMANT_DTTM > MAX_DATE AND
ROW_LASTMANT_DTTM < CURR_DATE)
AND
A.ROW_LASTMANT_DTTM =
(SELECT MAX(B.ROW_LASTMANT_DTTM) FROM SYSADM.JP_HISTORY_TBL B
WHERE A.CASE_ID = B.CASE_ID)
ORDER BY A.CASE_ID; FORALL I IN 1 .. HISTORY_CASE_ID_ROW.COUNT SAVE EXCEPTIONS UPDATE SYSADM.JP_HISTORY_TBL SET SYNC_DTTM=CURR_DATE WHERE CASE_ID = HISTORY_CASE_ID_ROW(I) AND
ROW_LASTMANT_DTTM = HISTORY_DATE_ROW(I); COMMIT; PREV_CASEID :=0;
PREV_DATE := NULL;
CURROW :=1;
CREROW :=1; FOR I IN 1 .. ACT_CASEIDVAL.COUNT LOOP IF PREV_CASEID <> ACT_CASEIDVAL(I) OR PREV_DATE <> ACT_MANTDTTMVAL(I) THEN
ASSIGN_FLAG:= TRUE;
HISTORY_SEL.EXTEND;
END IF; IF PREV_CASEID <> ACT_CASEIDVAL(I) THEN
IF HISTORY_PREV_ROW.LAST >= CURROW AND HISTORY_PREV_ROW(CURROW).CASE_ID = ACT_CASEIDVAL(I) THEN
HISTORY_SEL(HISTORY_SEL.LAST).TRANSACTION_FLAG :='C'; VASSIGNED_TO := HISTORY_PREV_ROW(CURROW).ASSIGNED_TO_NEW; VASSIGNED_TO_PG := HISTORY_PREV_ROW(CURROW).ASSIGNED_TO_PG_NEW; VSTATUS := HISTORY_PREV_ROW(CURROW).STATUS_NEW; VASSIGNED_TO_OLD := HISTORY_PREV_ROW(CURROW).ASSIGNED_TO_OLD; VASSIGNED_TO_PG_OLD := HISTORY_PREV_ROW(CURROW).ASSIGNED_TO_PG_OLD; VSTATUS_OLD := HISTORY_PREV_ROW(CURROW).STATUS_OLD; VASSIGNED_TO_FLAG := 'N'; VASSIGNED_TO_PG_FLAG := 'N'; VSTATUS_FLAG := 'N'; VSTATUS_OLD := VSTATUS; VASSIGNED_TO_OLD := VASSIGNED_TO; VASSIGNED_TO_PG_OLD :=VASSIGNED_TO_PG; CURROW := CURROW+1; ELSE HISTORY_SEL(HISTORY_SEL.LAST).TRANSACTION_FLAG :='A'; VASSIGNED_TO_FLAG := 'Y'; VASSIGNED_TO_PG_FLAG := 'Y'; VSTATUS_FLAG := 'Y'; VASSIGNED_TO := ' '; VASSIGNED_TO_PG := ' '; <<DATA_ISSUE>> IF ORG_CASEIDVAL(CREROW) = ACT_CASEIDVAL(I) THEN VASSIGNED_TO_OLD := ORG_CREATOR(CREROW); VASSIGNED_TO_PG_OLD := ORG_CREPG(CREROW); CREROW := CREROW +1; ELSE IF ORG_CASEIDVAL(CREROW) < ACT_CASEIDVAL(I) THEN CREROW := CREROW+1; IF CREROW <= ORG_CASEIDVAL.LAST THEN GOTO DATA_ISSUE; END IF; END IF; VASSIGNED_TO_OLD := ' '; VASSIGNED_TO_PG_OLD := ' '; END IF; VSTATUS_OLD := ' '; END IF;
ELSE
IF PREV_DATE <> ACT_MANTDTTMVAL(I) THEN
HISTORY_SEL(HISTORY_SEL.LAST).TRANSACTION_FLAG :='C'; VASSIGNED_TO_FLAG := 'N'; VASSIGNED_TO_PG_FLAG := 'N'; VSTATUS_FLAG := 'N'; VSTATUS_OLD := VSTATUS; VASSIGNED_TO_OLD := VASSIGNED_TO; VASSIGNED_TO_PG_OLD :=VASSIGNED_TO_PG;END IF;
END IF; IF ACT_EVNTVAL(I) ='AssignedToChanged' THEN
ASSIGN_FLAG:= FALSE;
IF HISTORY_SEL(HISTORY_SEL.LAST).TRANSACTION_FLAG='A' THEN
IF TRIM(ACT_NEWVAL(I)) IS NULL THEN
VASSIGNED_TO := ' ';
ELSE
VASSIGNED_TO :=ACT_NEWVAL(I);
END IF;
VASSIGNED_TO_FLAG := 'Y';
ELSE
IF TRIM(ACT_NEWVAL(I)) IS NULL THEN
VASSIGNED_TO :=' ';
ELSE
VASSIGNED_TO :=ACT_NEWVAL(I);
END IF;
VASSIGNED_TO_FLAG := 'Y';
IF TRIM(ACT_OLDVAL(I)) IS NULL THEN
VASSIGNED_TO_OLD := ' ';
ELSE
VASSIGNED_TO_OLD := ACT_OLDVAL(I);
END IF;
END IF;
END IF;
IF ACT_EVNTVAL(I)='AssignedToProviderGroup' OR
ACT_EVNTVAL(I) ='AssignedToProviderGroupChanged' OR
ACT_EVNTVAL(I) ='JP_AssignedToProviderGroupAdd' THEN
IF HISTORY_SEL(HISTORY_SEL.LAST).TRANSACTION_FLAG='A' THEN
VASSIGNED_TO_PG :=ACT_NEWVAL(I);
VASSIGNED_TO_PG_FLAG := 'Y';
ELSE
IF TRIM(ACT_NEWVAL(I)) IS NULL THEN
VASSIGNED_TO_PG :=' ';
ELSE
VASSIGNED_TO_PG :=ACT_NEWVAL(I);
END IF;
VASSIGNED_TO_PG_FLAG := 'Y';
IF TRIM(ACT_OLDVAL(I)) IS NULL THEN
VASSIGNED_TO_PG_OLD := ' ';
ELSE
VASSIGNED_TO_PG_OLD := ACT_OLDVAL(I);
END IF;
END IF;
END IF;
IF ACT_EVNTVAL(I) ='Status Changed' THEN
IF HISTORY_SEL(HISTORY_SEL.LAST).TRANSACTION_FLAG='A' THEN
IF ACT_NEWVAL(I)='Draft' THEN
HISTORY_SEL(HISTORY_SEL.LAST).TRANSACTION_FLAG:='D';
END IF;
IF TRIM(ACT_NEWVAL(I)) IS NULL THEN
VSTATUS := ' ';
ELSE
VSTATUS :=ACT_NEWVAL(I);
END IF;
VSTATUS_FLAG := 'Y';
ELSE
IF ACT_OLDVAL(I)='Draft' THEN
HISTORY_SEL(HISTORY_SEL.LAST).TRANSACTION_FLAG:='A';
END IF;
IF TRIM(ACT_NEWVAL(I)) IS NULL THEN
VSTATUS := ' ';
ELSE
VSTATUS :=ACT_NEWVAL(I);
END IF;
VSTATUS_FLAG := 'Y';
IF TRIM(ACT_OLDVAL(I)) IS NULL THEN
VSTATUS_OLD := ' ';
ELSE
VSTATUS_OLD := ACT_OLDVAL(I);
END IF;
END IF;
END IF;
HISTORY_SEL(HISTORY_SEL.LAST).CASE_ID := ACT_CASEIDVAL(I); HISTORY_SEL(HISTORY_SEL.LAST).ROW_LASTMANT_DTTM :=ACT_MANTDTTMVAL(I); HISTORY_SEL(HISTORY_SEL.LAST).ROW_LASTMANT_OPRID :=ACT_OPRIDVAL(I); HISTORY_SEL(HISTORY_SEL.LAST).ASSIGNED_TO_NEW:= VASSIGNED_TO; HISTORY_SEL(HISTORY_SEL.LAST).ASSIGNED_TO_OLD:= VASSIGNED_TO_OLD; HISTORY_SEL(HISTORY_SEL.LAST).ASSIGNED_TO_PG_NEW:=VASSIGNED_TO_PG; HISTORY_SEL(HISTORY_SEL.LAST).ASSIGNED_TO_PG_OLD:=VASSIGNED_TO_PG_OLD; HISTORY_SEL(HISTORY_SEL.LAST).STATUS_NEW:= VSTATUS ; HISTORY_SEL(HISTORY_SEL.LAST).STATUS_OLD:=VSTATUS_OLD;
HISTORY_SEL(HISTORY_SEL.LAST).ASSIGNED_TO_FLAG:=VASSIGNED_TO_FLAG ; HISTORY_SEL(HISTORY_SEL.LAST).ASSIGNED_TO_PG_FLAG:=VASSIGNED_TO_PG_FLAG ;
HISTORY_SEL(HISTORY_SEL.LAST).STATUS_FLAG:=VSTATUS_FLAG ; HISTORY_SEL(HISTORY_SEL.LAST).DURATION := 0; HISTORY_SEL(HISTORY_SEL.LAST).SYNC_DTTM := CURR_DATE;
PREV_CASEID :=ACT_CASEIDVAL(I);
PREV_DATE := ACT_MANTDTTMVAL(I);
END LOOP;
FORALL I IN 1 .. HISTORY_SEL.COUNT
SAVE EXCEPTIONS
INSERT INTO SYSADM.JP_HISTORY_TBL
VALUES HISTORY_SEL(I);
COMMIT;
SELECT CASE_ID, ROW_LASTMANT_DTTM
BULK COLLECT INTO UPD_HIS_CASE_ID_ROW,UPD_HIS_DATE_ROW
FROM SYSADM.JP_HISTORY_TBL
WHERE SYNC_DTTM=CURR_DATE
ORDER BY CASE_ID,ROW_LASTMANT_DTTM;
FOR I IN 1 .. (UPD_HIS_CASE_ID_ROW.COUNT)
LOOP
IF ( I < UPD_HIS_CASE_ID_ROW.COUNT AND UPD_HIS_CASE_ID_ROW(I) =
UPD_HIS_CASE_ID_ROW(I+1) ) THEN
UPD_HIS_DUR(I) := ROUND((UPD_HIS_DATE_ROW(I+1) - UPD_HIS_DATE_ROW(I))
*24*60,2);
ELSE
UPD_HIS_DUR(I) := ROUND((CURR_DATE - UPD_HIS_DATE_ROW(I)) *24*60,2);
END IF;
END LOOP;
FORALL I IN 1 .. UPD_HIS_DUR.COUNT SAVE EXCEPTIONS
UPDATE SYSADM.JP_HISTORY_TBL SET DURATION=UPD_HIS_DUR(I), SYNC_DTTM =
CURR_DATE
WHERE CASE_ID = UPD_HIS_CASE_ID_ROW(I) AND
ROW_LASTMANT_DTTM = UPD_HIS_DATE_ROW(I);
COMMIT;
UPDATE SYSADM.JP_HISTORY_TBL SET DURATION=0, SYNC_DTTM = CURR_DATE
WHERE
STATUS_NEW IN ('Closed','Cancelled') AND DURATION <> 0;
COMMIT;
INSERT INTO JP_REFRESH_ACTION VALUES('REPDB',SYSDATE);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ERRORS_COUNT :=SQL%BULK_EXCEPTIONS.COUNT;
DBMS_OUTPUT.PUT_LINE ('Errors : '||ERRORS_COUNT);
FOR INDX IN 1 .. ERRORS_COUNT LOOP
DBMS_OUTPUT.PUT_LINE(SQLERRM(SQL%BULK_EXCEPTIONS(INDX).ERROR_CODE));
END LOOP;
END;
/
Though this BULK COLLECT Is running fast in the DEV environment it is running on a hap hazard basis in the Quality Acceptance region . Do we need to specifically allocate and deallocate memore for BULK COLLECT ? Can you please advise on this Received on Tue Dec 06 2005 - 18:30:01 CET