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;
/
|