这个DELETE过程有什么问题.我们可以这样写,还是有更好的方法来编写相同的proc

-1 sql oracle plsql

这里我们只是在90天历史记录之前删除主表和子表中的记录.假设表中有超过20k的记录可供删除.在这里,我为每个5k记录提交了提交.如果我错了,请告诉我?

create or replace Procedure PURGE_CLE_ALL_STATUS  ( days_in IN number ) 
IS 

       reccount  NUMBER  := 0;

       CURSOR del_record_cur IS

    SELECT EXCEPTIONID   FROM   EXCEPTIONREC
         WHERE  trunc(TIME_STAMP) < trunc(sysdate - days_in );


BEGIN
       FOR rec IN del_record_cur LOOP

      delete from EXCEPTIONRECALTKEY   -- child table 
          where EXCEPTIONID =rec.EXCEPTIONID ;

      delete from EXCEPTIONREC -- master table
          where EXCEPTIONID =rec.EXCEPTIONID;  


         reccount := reccount + 1;

         IF (reccount >= 1000) THEN
           COMMIT;
           count := 0;
         END IF;
       commit;
       END LOOP;
       COMMIT;
       DBMS_OUTPUT.PUT_LINE('Deleted ' || total || ' records from <OWNER>.<TABLE_NAME>.');
END;
/
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 5

如果您在询问是否可以提高代码效率,那么最有效的方法始终是在SQL中执行操作

BEGIN
  DELETE FROM EXCEPTIONRECALTKEY child
   WHERE EXISTS( SELECT 1
                   FROM EXCEPTIONREC parent
                  WHERE child.EXCEPTIONID = parent.EXCEPTIONID 
                    AND parent.timestamp <= trunc(sysdate - days_in ) );
  DELETE FROM EXCEPTIONREC 
   WHERE timestamp <= trunc(sysdate - days_in );
END;
Run Code Online (Sandbox Code Playgroud)