-1

ジャスティン、あなたの提案に従って、ここにループを追加しました。

とにかくこの手順を調整することはできますか?私はまだテストしていません。

ここでは、90日間の履歴レコードの前にマスターテーブルと子テーブルからレコードを削除しています。テーブルに2万を超えるレコードがあり、削除する必要があると想定します。そしてここで私は5kレコードごとにコミットを入れます..私がここで間違っているかどうか教えてください?

create or replace 
Procedure PURGE_CLE_ALL_STATUS 
 ( days_in IN number ) 
  IS 
  LV_EXCEPTIONID NUMBER;    
i number := 0;  


cursor s1 is 
        select EXCEPTIONID 
          from EXCEPTIONREC --- master table 
          where TIME_STAMP < (sysdate -days_in); 

BEGIN  

for c1 in s1 loop

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

     delete from EXCEPTIONREC 
     where EXCEPTIONID =c1.EXCEPTIONID; 

     i := i + 1;              

     if i > 5000 then      
      commit;         
      i := 0;      
     end if;  

end loop;  


commit;      

close S1; 
EXCEPTION 
WHEN OTHERS THEN 
      raise_application_error(-20001,'An error was encountered - '|| 
                                      SQLCODE||' -ERROR- '||SQLERRM); 
END; 
/
4

2 に答える 2

3

カーソルの代わりに..削除ステートメントで条件を直接指定できます..

以下のように-

create or replace
Procedure PURGE_CLE_ALL_STATUS
 ( days_in IN number )
  IS
  LV_EXCEPTIONID NUMBER;   

BEGIN    

     delete from EXCEPTIONRECALTKEY   -- child table
     where EXCEPTIONID = -- (1)
          (select EXCEPTIONID
          from EXCEPTIONREC --- master table
          where TIME_STAMP < (sysdate -days_in));

     delete from EXCEPTIONREC
     where EXCEPTIONID = --(2)
          (select EXCEPTIONID
          from EXCEPTIONREC --- master table
          where TIME_STAMP < (sysdate -days_in));

commit;     
end if;
close c1;
END;
/

私はジャスティン・ケイブに完全に同意します..彼は非常に良い点を与えました..カーソルから複数の行を取得している場合.. (1)と(2)inの代わりに使用できます。=

于 2012-05-15T15:04:38.303 に答える