DECLARE
  CURSOR MYCURSOR IS
    SELECT ROWID FROM TEST WHERE XXX = XXXX ORDER BY ROWID; --------按ROWID排序的Cursor,删除条件是XXX=XXXX,根据实际情况来定。 TYPE ROWID_TABLE_TYPE IS TABLE OF ROWID INDEX BY PLS_INTEGER;
  V_ROWID ROWID_TABLE_TYPE;
BEGIN
  OPEN MYCURSOR;
  LOOP
    FETCH MYCURSOR BULK COLLECT
      INTO V_ROWID LIMIT 5000; --------每次处理5000行,也就是每5000行一提交
    EXIT WHEN V_ROWID.COUNT = 0;
    FORALL I IN V_ROWID.FIRST .. V_ROWID.LAST
      DELETE FROM TEST WHERE ROWID = V_ROWID(I);
    COMMIT;
  END LOOP;
  CLOSE MYCURSOR;
END;

解决方案 »

  1.   

    放在存储过程中 使用游标,或者试试这样的create or replace procedure deleteTab
      /**
       ** Usage: run the script to create the proc deleteTab
       **        in SQL*PLUS, type "exec deleteTab('Foo','ID>=1000000','3000');"
       **        to delete the records in the table "Foo", commit per 3000 records.
       **       Condition with default value '1=1' and default Commit batch is 10000.
       **/
      (
        p_TableName    in    varchar2,    -- The TableName which you want to delete from
        p_Condition    in    varchar2 default '1=1',    -- Delete condition, such as "id>=100000"
        p_Count        in    varchar2 default '10000'    -- Commit after delete How many records
      )
      as
       pragma autonomous_transaction;
       n_delete number:=0;
      begin
       while 1=1 loop
         EXECUTE IMMEDIATE 
         'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn' 
         USING p_Count;
         if SQL%NOTFOUND then
         exit;
         else
              n_delete:=n_delete + SQL%ROWCOUNT;
         end if;
         commit;
       end loop;
       commit;
       DBMS_OUTPUT.PUT_LINE('Finished!');
       DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
      end;