Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Limiting num# of records in cursor using loop

JSMQJul 13 2018 — edited Jul 18 2018

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,

)

This post has been answered by JSMQ on Jul 18 2018
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Aug 15 2018
Added on Jul 13 2018
28 comments
3,387 views