| 導購 | 订阅 | 在线投稿
分享
 
 
 

教你快速掌握分別刪除數據表記錄的方法

2008-06-01 03:23:11  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
  很多情況下我們需要分別刪除數據表的一些記錄,分批來提交以此來減少對于Undo的使用,下面我們提供一個簡單的存儲過程來實現此邏輯。
  SQL> create table test as select * from dba_objects;
  Table created.
  SQL> create or replace procedure deleteTab
  2 /**
  3 ** Usage: run the script to create the proc deleteTab
  4 ** in SQL*PLUS, type "exec deleteTab('Foo','ID>=1000000','3000');"
  5 ** to delete the records in the table "Foo", commit per 3000 records.
  6 ** Condition with default value '1=1' and default Commit batch is 10000.
  7 **/
  8 (
  9 p_TableName in varchar2, -- The TableName which you want to delete from
  10 p_Condition in varchar2 default '1=1', -- Delete condition, such as "id>=100000"
  11 p_Count in varchar2 default '10000' -- Commit after delete How many records
  12 )
  13 as
  14 pragma autonomous_transaction;
  15 n_delete number:=0;
  16 begin
  17 while 1=1 loop
  18 EXECUTE IMMEDIATE
  19 'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'
  20 USING p_Count;
  21 if SQL%NOTFOUND then
  22 exit;
  23 else
  24 n_delete:=n_delete + SQL%ROWCOUNT;
  25 end if;
  26 commit;
  27 end loop;
  28 commit;
  29 DBMS_OUTPUT.PUT_LINE('Finished!');
  30 DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
  31 end;
  32 /
  Procedure created.
  SQL> insert into test select * from dba_objects;
  6374 rows created.
  SQL> /
  6374 rows created.
  SQL> /
  6374 rows created.
  SQL> commit;
  Commit complete.
  SQL> exec deleteTab('TEST','object_id >0','3000')
  Finished!
  Totally 19107 records deleted!
  PL/SQL procedure successfully completed.
  注釋:在此實例中修正了一下,增加了2個缺省值,以下是具體過程:
  create or replace procedure deleteTab
  (
  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!');
  注釋:讀者可以根據自己的實際情況來進行適當的調整。
 
很多情況下我們需要分別刪除數據表的一些記錄,分批來提交以此來減少對于Undo的使用,下面我們提供一個簡單的存儲過程來實現此邏輯。 SQL> create table test as select * from dba_objects; Table created. SQL> create or replace procedure deleteTab 2 /** 3 ** Usage: run the script to create the proc deleteTab 4 ** in SQL*PLUS, type "exec deleteTab('Foo','ID>=1000000','3000');" 5 ** to delete the records in the table "Foo", commit per 3000 records. 6 ** Condition with default value '1=1' and default Commit batch is 10000. 7 **/ 8 ( 9 p_TableName in varchar2, -- The TableName which you want to delete from 10 p_Condition in varchar2 default '1=1', -- Delete condition, such as "id>=100000" 11 p_Count in varchar2 default '10000' -- Commit after delete How many records 12 ) 13 as 14 pragma autonomous_transaction; 15 n_delete number:=0; 16 begin 17 while 1=1 loop 18 EXECUTE IMMEDIATE 19 'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn' 20 USING p_Count; 21 if SQL%NOTFOUND then 22 exit; 23 else 24 n_delete:=n_delete + SQL%ROWCOUNT; 25 end if; 26 commit; 27 end loop; 28 commit; 29 DBMS_OUTPUT.PUT_LINE('Finished!'); 30 DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!'); 31 end; 32 / Procedure created. SQL> insert into test select * from dba_objects; 6374 rows created. SQL> / 6374 rows created. SQL> / 6374 rows created. SQL> commit; Commit complete. SQL> exec deleteTab('TEST','object_id >0','3000') Finished! Totally 19107 records deleted! PL/SQL procedure successfully completed. 注釋:在此實例中修正了一下,增加了2個缺省值,以下是具體過程: create or replace procedure deleteTab ( 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!'); 注釋:讀者可以根據自己的實際情況來進行適當的調整。
󰈣󰈤
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
  免責聲明:本文僅代表作者個人觀點,與王朝網絡無關。王朝網絡登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
© 2005- 王朝網路 版權所有