Question : Procudure takes long hours to complete

I have millions of data to load into my target table. Will using Bulk collect reduce the performance. Kindly let me know the ways to improve performance. Will a direct select and insert be a better solution.

Code Snippet:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
CREATE OR REPLACE PROCEDURE TESTEPM.KAP_ACD_ID (process_cd NUMBER) IS
-- Type declarations for column arrays for bulk collect on cursor
    TYPE v_rowid_tab
        IS TABLE OF ROWID
        INDEX BY BINARY_INTEGER;
    TYPE v_workflow_prc_id_tab
IS TABLE OF EPT_WORKFLOW_ACTIVITY_DIR_STG.ACD_WORKFLOW_PRC_GUID_ID %TYPE
            INDEX BY BINARY_INTEGER;
    TYPE v_workflow_step_id_tab
IS TABLE OF EPT_WORKFLOW_ACTIVITY_DIR_STG.ACD_WORKFLOW_STEP_GUID_ID%TYPE        INDEX BY BINARY_INTEGER;
     TYPE v_src_sys_cd_tab
        IS TABLE OF  EPT_WORKFLOW_ACTIVITY_DIR_STG.ACD_SOURCE_SYS_CD%TYPE
        INDEX BY BINARY_INTEGER;
-- Column array definitions
    v_rowid             v_rowid_tab;
    v_workflow_prc_id     v_workflow_prc_id_tab;
      v_workflow_step_id      v_workflow_step_id_tab;
    v_src_sys_cd         v_src_sys_cd_tab;
-- Declare a cursor to get all new records that are present in the STAGING Table  not in the Directory Table
    CURSOR new_records_cur IS
        select
            STG.ROWID,
            STG.ACD_WORKFLOW_PRC_GUID_ID,
                  STG.ACD_WORKFLOW_STEP_GUID_ID,
            STG.ACD_SOURCE_SYS_CD
            from EPT_WORKFLOW_ACTIVITY_DIR DIR
            RIGHT OUTER JOIN EPT_WORKFLOW_ACTIVITY_DIR_STG STG
            on DIR.ACD_WORKFLOW_PRC_GUID_ID = STG.ACD_WORKFLOW_PRC_GUID_ID
            and DIR.ACD_WORKFLOW_STEP_GUID_ID = STG.ACD_WORKFLOW_STEP_GUID_ID
            and DIR.ACD_SOURCE_SYS_CD = STG.ACD_SOURCE_SYS_CD
            where STG.ACD_PROCESS_CD = process_cd
            and DIR.ACD_WORKFLOW_ID is null;
    -- Work variables
    BatchRows PLS_INTEGER := 100;  -- Number of records pulled into array
BEGIN
    OPEN new_records_cur;
    LOOP
-- Populate the arrays to store BatchRows number of rows
-- per loop until no more rows are returned by the cursor.
        FETCH new_records_cur BULK COLLECT
        INTO v_rowid,v_workflow_prc_id,v_workflow_step_id,v_src_sys_cd
        LIMIT BatchRows;
        EXIT WHEN v_workflow_prc_id.COUNT < 1; -- No more rows left in cursor
-- For all new records, insert into the directory table.
-- All exceptions thrown by the insert statement will be
-- checked by the EXCEPTION clause.  The procedure will allow
-- unique constraints but will fail on any other exception.
        BEGIN
            FOR i IN v_workflow_prc_id.FIRST.. v_workflow_prc_id.LAST
            LOOP
            BEGIN
            INSERT INTO EPT_WORKFLOW_ACTIVITY_DIR
            (ACD_WORKFLOW_ID,
            ACD_WORKFLOW_PRC_GUID_ID,
            ACD_WORKFLOW_STEP_GUID_ID,
            ACD_SOURCE_SYS_CD)
            VALUES (EWQ_WORKFLOW_ID.NEXTVAL,
            v_workflow_prc_id (i),
            v_workflow_step_id (i),
            v_src_sys_cd(i));
            EXCEPTION
            WHEN OTHERS THEN
            IF SQLCODE != -1 THEN  -- NOT a unique constraint error
            RAISE;           -- Stop procedure
            END IF;
        END;
    END LOOP;
END;
-- Update AND_NEW_ID_IND field in staging table to 'Y' since the
-- record was new because the native key was not in the ORG
-- directory table.  Update is done by row id so that an index
-- is not necessary on the staging table.
        FORALL i IN v_workflow_prc_id.FIRST.. v_workflow_prc_id.LAST
    Update EPT_WORKFLOW_ACTIVITY_DIR_STG SET ACD_NEW_ID_IND = 'Y'
        where EPT_WORKFLOW_ACTIVITY_DIR_STG.ROWID = v_rowid(i);
        COMMIT; -- Commit every BatchRows number of rows
        END LOOP;
        CLOSE new_records_cur;
        EXCEPTION
        WHEN OTHERS THEN
        RAISE;
END KAP_ACD_ID;
/
Open in New Window Select All

Answer : Procudure takes long hours to complete


Here is your code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
CREATE OR REPLACE PROCEDURE testepm.kap_acd_id (process_cd NUMBER)
IS
-- Type declarations for column arrays for bulk collect on cursor
   TYPE v_rowid_tab IS TABLE OF ROWID
      INDEX BY BINARY_INTEGER;
 
   TYPE v_workflow_prc_id_tab IS TABLE OF ept_workflow_activity_dir_stg.acd_workflow_prc_guid_id%TYPE
      INDEX BY BINARY_INTEGER;
 
   TYPE v_workflow_step_id_tab IS TABLE OF ept_workflow_activity_dir_stg.acd_workflow_step_guid_id%TYPE
      INDEX BY BINARY_INTEGER;
 
   TYPE v_src_sys_cd_tab IS TABLE OF ept_workflow_activity_dir_stg.acd_source_sys_cd%TYPE
      INDEX BY BINARY_INTEGER;
 
-- Column array definitions
   v_rowid              v_rowid_tab;
   v_workflow_prc_id    v_workflow_prc_id_tab;
   v_workflow_step_id   v_workflow_step_id_tab;
   v_src_sys_cd         v_src_sys_cd_tab;
 
-- Declare a cursor to get all new records that are present in the STAGING Table  not in the Directory Table
   CURSOR new_records_cur
   IS
      SELECT stg.ROWID, stg.acd_workflow_prc_guid_id,
             stg.acd_workflow_step_guid_id, stg.acd_source_sys_cd
        FROM ept_workflow_activity_dir dir RIGHT OUTER JOIN ept_workflow_activity_dir_stg stg
             ON dir.acd_workflow_prc_guid_id = stg.acd_workflow_prc_guid_id
           AND dir.acd_workflow_step_guid_id = stg.acd_workflow_step_guid_id
           AND dir.acd_source_sys_cd = stg.acd_source_sys_cd
       WHERE stg.acd_process_cd = process_cd AND dir.acd_workflow_id IS NULL;
 
   -- Work variables
   batchrows            PLS_INTEGER            := 100;
   -- Number of records pulled into array
   i                    PLS_INTEGER;
   -- create an exception handler for ORA-24381
   ERRORS               NUMBER;
   dml_errors           EXCEPTION;
   PRAGMA EXCEPTION_INIT (dml_errors, -24381);
BEGIN
   OPEN new_records_cur;
 
   LOOP
-- Populate the arrays to store BatchRows number of rows
-- per loop until no more rows are returned by the cursor.
      FETCH new_records_cur
      BULK COLLECT INTO v_rowid, v_workflow_prc_id, v_workflow_step_id,
             v_src_sys_cd LIMIT batchrows;
 
      EXIT WHEN v_workflow_prc_id.COUNT < 1;   -- No more rows left in cursor
 
-- For all new records, insert into the directory table.
-- All exceptions thrown by the insert statement will be
-- checked by the EXCEPTION clause.  The procedure will allow
-- unique constraints but will fail on any other exception.
      BEGIN
         FORALL i IN v_workflow_prc_id.FIRST .. v_workflow_prc_id.LAST SAVE EXCEPTIONS
            INSERT INTO ept_workflow_activity_dir
                        (acd_workflow_id, acd_workflow_prc_guid_id,
                         acd_workflow_step_guid_id, acd_source_sys_cd
                        )
                 VALUES (ewq_workflow_id.NEXTVAL, v_workflow_prc_id (i),
                         v_workflow_step_id (i), v_src_sys_cd (i)
                        );
      EXCEPTION
         WHEN dml_errors
         THEN
            ERRORS := SQL%BULK_EXCEPTIONS.COUNT;
 
            FOR i IN 1 .. ERRORS
            LOOP
               -- If NOT a unique constraint error, Stop procedure
               IF SQL%BULK_EXCEPTIONS (i).ERROR_CODE != 'ORA-00001'
               THEN
                  RAISE;
               END IF;
            END LOOP;
      END;
 
-- Update AND_NEW_ID_IND field in staging table to 'Y' since the
-- record was new because the native key was not in the ORG
-- directory table.  Update is done by row id so that an index
-- is not necessary on the staging table.
      FORALL i IN v_workflow_prc_id.FIRST .. v_workflow_prc_id.LAST
         UPDATE ept_workflow_activity_dir_stg
            SET acd_new_id_ind = 'Y'
          WHERE ept_workflow_activity_dir_stg.ROWID = v_rowid (i);
      COMMIT;                         -- Commit every BatchRows number of rows
   END LOOP;
 
   CLOSE new_records_cur;
EXCEPTION
   WHEN OTHERS
   THEN
      RAISE;
END kap_acd_id;
/
Open in New Window Select All
Random Solutions  
 
programming4us programming4us