-1

ここでは、90 日間の履歴レコードの前に、マスター テーブルと子テーブルからレコードを削除しています。テーブルに 20,000 を超えるレコードがあり、削除する必要があるとします。ここでは、5k レコードごとに commit します。ここで間違っているかどうか教えてください。

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;
/
4

2 に答える 2

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;
于 2012-05-21T03:24:57.360 に答える
2

EXCEPTIONRECALTKEY から EXCEPTIONREC までの外部キーが定義されている場合、2 つのテーブルを結合するインライン ビューに対して削除を発行し、親テーブルに対して WHERE 句を指定して、子テーブルからレコードを削除することができます。

したがって:

BEGIN
  delete from (
    select
      p.EXCEPTIONID p_EXCEPTIONID,
      c.EXCEPTIONID c_EXCEPTIONID,
      c.TIME_STAMP  c_TIME_STAMP
    from
      EXCEPTIONREC       p,
      EXCEPTIONRECALTKEY c
    where
      p.EXCEPTIONID = c.EXCEPTIONID and
      c.TIMESTMAP < trunc(sysdate - days_in ));

  delete from
    EXCEPTIONREC
  where
    TIMESTMAP < trunc(sysdate - days_in );  
end;
/
于 2012-05-21T11:29:11.407 に答える