Hi - I have this proc to load data in to an Oracle(11.2) target table 3 . Here i'd like to limit the number of rows fetching(say 1000 rows for each iteration) by select query while storing into the cursor itself(since both table 1 has 5 million and table has 10 million records) before use it in bulk collect .
create or replace PROCEDURE PROC2 AS
l_error NUMBER := 0;
v_ins_cnt NUMBER := 0;
CURSOR c1
IS
SELECT RSS.USRN,
RSS.SECT,
RSS.REG,
RSS.SN_YR_MN,
RSS.SN_YR,
RSS.SN_MN,
COUNT(DISTINCT concat(ISS.PROJECT, ISS.SOLUTION)) PRO_CT,
ISS.CATG,
ISS.TLT,
COUNT(DISTINCT ISS.ISSUE_ID) UQ_ISS_CT,
COUNT(DISTINCT ISS.PATH) FILES_SN_ISS_CT,
COUNT(DISTINCT RSS.PATH) TOT_FILES_SN_CT,
COUNT(DISTINCT RSS.SCAN_ID) TOT_SN_CT,
CURRENT_DATE
FROM table1 RSS,
table2 ISS
WHERE RSS.USRN =ISS.USRN
--AND RSS.SN_YR_MN=iss.SN_YR_MN
AND RSS.SN_YR=iss.SN_YR
AND RSS.SN_MN=iss.SN_MN
AND RSS.PROJECT =ISS.PROJECT
AND RSS.REG =ISS.REG
AND RSS.SECT =ISS.SECT
GROUP BY RSS.USRN,
RSS.SECT,
RSS.REG,
RSS.SN_YR_MN,
RSS.SN_YR,
RSS.SN_MN,
ISS.CATG,
ISS.TLT ;
TYPE rec_ary IS TABLE OF c1%ROWTYPE ;
v_rec_ary rec_ary := rec_ary ();
BEGIN
OPEN c1;
LOOP
FETCH c1 BULK COLLECT INTO v_rec_ary LIMIT 3000;
EXIT WHEN v_rec_ary.COUNT = 0;
BEGIN
FORALL i IN 1 .. v_rec_ary.COUNT SAVE EXCEPTIONS
INSERT INTO table3 values v_rec_ary(i);
COMMIT;
v_ins_cnt := v_ins_cnt + SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE(' No of records Inserted --> '||v_ins_cnt);
EXCEPTION
WHEN OTHERS THEN
l_error := SQL%BULK_EXCEPTIONS.COUNT;
FOR k IN 1 .. l_error
LOOP
DBMS_OUTPUT.put_line
(
'Error: ' || k || ' Array Index: ' || SQL%BULK_EXCEPTIONS (k).ERROR_INDEX || ' Message: ' || SQLERRM (-SQL%BULK_EXCEPTIONS (k).ERROR_CODE)
)
;
END LOOP;
END;
EXIT WHEN c1%NOTFOUND;
END LOOP;
<<eop>>
CLOSE C1;
END;
CREATE TABLE TABLE3
(
SECT VARCHAR2(128),
REG VARCHAR2(128),
USRN VARCHAR2(128),
PRO_CT NUMBER(10),
CATG VARCHAR2(256),
TLT VARCHAR2(512),
SN_YR_MN VARCHAR2(7),
SN_YR VARCHAR2(4),
SN_MN VARCHAR2(2),
UQ_ISS_CT NUMBER(10),
FILES_SN_ISS_CT NUMBER(10),
TOT_FILES_SN_CT NUMBER(10),
TOT_SN_CT NUMBER(10),
LOAD_DATE_TIME DATE NOT NULL,
)