Innitially the procedure was like:

Code:
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;
But seems that this one makes a delete statement for each row which is not good when you have millions rows to delete