Innitially the procedure was like:
But seems that this one makes a delete statement for each row which is not good when you have millions rows to deleteCode:CREATE OR REPLACE PROCEDURE DB_CLEANUP_PROCEDURE IS i INTEGER; TYPE j IS TABLE OF ROWID; row_id j; v_table_name VARCHAR2(30); v_column_name VARCHAR2(30); v_retention_days NUMBER(9); k NUMBER := 0; BEGIN FOR rec IN (SELECT dcp.table_name, dcp.date_field_name, dcp.retention_days FROM db_cleanup_parameters dcp) LOOP v_table_name := rec.table_name; v_column_name := rec.date_field_name; v_retention_days := rec.retention_days; EXECUTE IMMEDIATE 'SELECT ROWID FROM ' || v_table_name || ' WHERE ' || v_column_name || ' < (SYSDATE - ' || v_retention_days || ')' BULK COLLECT INTO row_id; FOR i IN 1 .. row_id.COUNT LOOP EXECUTE IMMEDIATE 'DELETE FROM '||v_table_name||' WHERE ROWID = '''|| row_id(i)||''''; k := k + 1; IF k = 1000 THEN COMMIT; k := 0; END IF; END LOOP; END LOOP; COMMIT; END DB_CLEANUP_PROCEDURE;




Reply With Quote