I found that bulk operations DO work with execute immediate!! Procedure is as follows:
CREATE OR REPLACE PACKAGE BODY HR_CUSTOM_PROCS_FUNCS IS
PROCEDURE PROC_REFRESH_HR_SECURITY_TREE IS
TYPE NEW_HR_SECURITY_TABLE_DATA IS TABLE OF RDSPRD.HR_SECURITY_TREE%ROWTYPE;
NEW_HR_SECURITY_TABLE_DATA_T NEW_HR_SECURITY_TABLE_DATA;
BEGIN
EXECUTE IMMEDIATE 'SELECT SUBSTR(A.PATH, 1, 6) DEPT,
SUBSTR(A.PATH, 8, 6) ROOT,
SUBSTR(A.PATH, 15, 6) LEVEL1,
SUBSTR(A.PATH, 22, 6) LEVEL2,
SUBSTR(A.PATH, 29, 6) LEVEL3,
SUBSTR(A.PATH, 36, 6) LEVEL4
FROM (SELECT TREE_NODE ||
RPAD(SYS_CONNECT_BY_PATH(TREE_NODE, '',''), 35, '',NULL '') "PATH"
FROM (SELECT TREE_NODE,
TREE_NODE_NUM,
PARENT_NODE_NUM,
EFFDT,
TREE_NAME
FROM RDSSTG_HRSA.PSTREENODE
WHERE TREE_NAME =
''DEPT_SECURITY''
AND EFFDT =
(SELECT MAX(B.EFFDT)
FROM RDSSTG_HRSA.PSTREENODE B
WHERE B.TREE_NAME =
''DEPT_SECURITY''))
START WITH TREE_NODE_NUM = 1
CONNECT BY PRIOR
TREE_NODE_NUM =
PARENT_NODE_NUM
ORDER BY 1) A'
BULK COLLECT
INTO NEW_HR_SECURITY_TABLE_DATA_T;
IF NEW_HR_SECURITY_TABLE_DATA_T.COUNT > 0 THEN
EXECUTE IMMEDIATE 'TRUNCATE TABLE RDSPRD.HR_SECURITY_TREE';
FORALL I IN NEW_HR_SECURITY_TABLE_DATA_T.FIRST .. NEW_HR_SECURITY_TABLE_DATA_T.LAST
INSERT INTO RDSPRD.HR_SECURITY_TREE
VALUES NEW_HR_SECURITY_TABLE_DATA_T
(I);
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
BEGIN
RDS_MAIL.mail('sbealer@csuchico.edu', 'sbealer@csuchico.edu', 'PROC_REFRESH_HR_SECURITY_TREE Failure', 'Error message was: '||SQLERRM);
END;
END PROC_REFRESH_HR_SECURITY_TREE;
END HR_CUSTOM_PROCS_FUNCS;
No comments:
Post a Comment