General
=====================
This is a code example of a job which is calling a generic procedure, which is calling a dedicated procedure, to delete data from tables using BULK_COLLECT
=====================
Code
=====================
Job:
Generic Procedure:
Dedicated Procedure:
=====================
Job
=====================
DECLARE
v_job_number NUMBER(10);
BEGIN
DBMS_JOB.SUBMIT (JOB => v_job_number,
WHAT => 'ADMIN_UTIL.CALL_PURGE_COUNT_HIST(5,20000);',
NEXT_DATE => TRUNC(SYSDATE + 1)+3/24+30/1440,
INTERVAL => 'TRUNC(SYSDATE + 1)+3/24+30/1440'
);
COMMIT;
END;
/
Job
=====================
DECLARE
v_job_number NUMBER(10);
BEGIN
DBMS_JOB.SUBMIT (JOB => v_job_number,
WHAT => 'ADMIN_UTIL.CALL_PURGE_COUNT_HIST(5,20000);',
NEXT_DATE => TRUNC(SYSDATE + 1)+3/24+30/1440,
INTERVAL => 'TRUNC(SYSDATE + 1)+3/24+30/1440'
);
COMMIT;
END;
/
=====================
Generic Procedure
=====================
CREATE OR REPLACE PACKAGE BODY ADMIN_UTIL IS
------------------------------------
PROCEDURE CALL_PURGE_COUNT_HIST(p_days IN NUMBER, p_delete IN NUMBER) IS
v_module_name SGA_W_LOG.procedure_name%TYPE;
v_msg_text SGA_W_LOG.data%TYPE;
v_rows_deleted NUMBER;
v_total_rows_deleted NUMBER;
BEGIN
v_module_name := 'ADMIN_UTIL.CALL_PURGE_COUNT_HIST';
v_rows_deleted := 1;
v_total_rows_deleted := 0;
v_msg_text := 'Produre is Starting';
SGA_PKG.write_sga_w_log(v_module_name, v_msg_text);
v_msg_text := 'Running Delete with Parameters: Keep Days: '||p_days||' '||'Delete Chunk: '||p_delete;
SGA_PKG.write_sga_w_log(v_module_name, v_msg_text);
WHILE v_rows_deleted > 0 LOOP
GA_PKG.PurgeCountersHistory(v_rows_deleted,p_days, p_delete);
v_total_rows_deleted := v_total_rows_deleted + v_rows_deleted;
END LOOP;
v_msg_text := 'Number of Deleted Rows: '||TO_CHAR(v_total_rows_deleted);
SGA_PKG.write_sga_w_log(v_module_name, v_msg_text);
v_msg_text := 'Produre has Finished';
SGA_PKG.write_sga_w_log(v_module_name, v_msg_text);
EXCEPTION
WHEN OTHERS THEN
v_msg_text := 'Error in procedure '||v_module_name||'. Error Details: '|| SUBSTR(SQLERRM, 1, 900);
SGA_PKG.write_sga_w_log(v_module_name,v_msg_text);
END CALL_PURGE_COUNT_HIST;
------------------------------------
END ADMIN_UTIL;
Generic Procedure
=====================
CREATE OR REPLACE PACKAGE BODY ADMIN_UTIL IS
------------------------------------
PROCEDURE CALL_PURGE_COUNT_HIST(p_days IN NUMBER, p_delete IN NUMBER) IS
v_module_name SGA_W_LOG.procedure_name%TYPE;
v_msg_text SGA_W_LOG.data%TYPE;
v_rows_deleted NUMBER;
v_total_rows_deleted NUMBER;
BEGIN
v_module_name := 'ADMIN_UTIL.CALL_PURGE_COUNT_HIST';
v_rows_deleted := 1;
v_total_rows_deleted := 0;
v_msg_text := 'Produre is Starting';
SGA_PKG.write_sga_w_log(v_module_name, v_msg_text);
v_msg_text := 'Running Delete with Parameters: Keep Days: '||p_days||' '||'Delete Chunk: '||p_delete;
SGA_PKG.write_sga_w_log(v_module_name, v_msg_text);
WHILE v_rows_deleted > 0 LOOP
GA_PKG.PurgeCountersHistory(v_rows_deleted,p_days, p_delete);
v_total_rows_deleted := v_total_rows_deleted + v_rows_deleted;
END LOOP;
v_msg_text := 'Number of Deleted Rows: '||TO_CHAR(v_total_rows_deleted);
SGA_PKG.write_sga_w_log(v_module_name, v_msg_text);
v_msg_text := 'Produre has Finished';
SGA_PKG.write_sga_w_log(v_module_name, v_msg_text);
EXCEPTION
WHEN OTHERS THEN
v_msg_text := 'Error in procedure '||v_module_name||'. Error Details: '|| SUBSTR(SQLERRM, 1, 900);
SGA_PKG.write_sga_w_log(v_module_name,v_msg_text);
END CALL_PURGE_COUNT_HIST;
------------------------------------
END ADMIN_UTIL;
=====================
Dedicated Procedure
=====================
Dedicated Procedure
=====================
CREATE OR REPLACE PACKAGE BODY GA_PKG IS
PROCEDURE PurgeCountersHistory(p_retvalue OUT NUMBER,p_days IN NUMBER, p_delete IN NUMBER) IS
last_date DATE;
TYPE MYROWIDRESULT IS TABLE OF ROWID INDEX BY BINARY_INTEGER ;
v_rowidresult MYROWIDRESULT;
BEGIN
last_date := SYSDATE - p_days;
p_retvalue := 0;
-- SELECT ROWID FOR RECORDS NEED TO BE DELETED
SELECT ROWID
BULK COLLECT
INTO v_rowidresult
FROM COUNTERS_HISTORY
WHERE ts_last_modified < last_date
AND rownum < (p_delete +1); -- SO THE DELETE WILL EXACTLY AS REQUESTED
-- DELETE ROWS WHICH THEIR LAST LOCATION UPDATE WAS P_HOURS BEFORE.
BEGIN
FORALL ROWIDINDEX IN NVL(V_ROWIDRESULT.FIRST,1)..NVL(V_ROWIDRESULT.LAST,0)
DELETE FROM COUNTERS_HISTORY WHERE ROWID = V_ROWIDRESULT(ROWIDINDEX) ;
p_retvalue := SQL%ROWCOUNT;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
p_retvalue := -1;
RAISE_APPLICATION_ERROR(-20000,'PURGE COUNTERS_HISTORY, DELETE ROWS ' || SQLCODE || SQLERRM);
END;
COMMIT;
-- INSERT ROW TO LOG TABLE WITH THE NUMBER OF ROWS WHICH WERE DELETED
BEGIN
INSERT INTO SGA_W_LOG (procedure_name, data, ts_last_modified)
VALUES ('GA_PKG.PURGECOUNTERSHISTORY', TO_CHAR(p_retvalue), SYSDATE);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000,'PURGE COUNTERS_HISTORY, INSERT ROW TO THE LOG ' || SQLCODE || ' ' || SQLERRM);
END;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000,'PURGE COUNTERS_HISTORY :' || SQLCODE || SQLERRM);
END;
END GA_PKG ;
No comments:
Post a Comment