oracle儲存過程刪除大量資料

2021-08-15 06:48:38 字數 1973 閱讀 7574

create or replace procedure delbigtab  

( p_tablename in varchar2,

p_condition in varchar2,

p_count in varchar2

) 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;

-用delbigtab來刪除資料  

例項1:  

sql>

exec delbigtab('t_delta_log_test',

'entity_type=4',

'1000');  

--刪除t_delta_log中滿足條件entity_type=4的資料,每300 條commit一次  

例項2:刪除t_delta_log_test表中所有資料,每1000條commit一次  

sql>exec delbigtab('t_delta_log_test',

'1=1',

'1000');  

分析:  

1、因為刪除資料的表以及條件都是作為引數傳進來的,因此delete語句要動態構建。

這裡使用了execute immediate來完成。其中有乙個引數rn,用using將p_count的值傳進去;  

2、批量刪除的主要實現原理是使用rownum<=:rn,就是刪除固定的前p_count條。主要原理要求對oracle的rownum有好的理解;  

3、sql%notfound、sql%

found和sql%rowcount

是oracle有關游標的3個常見屬性值。

在執行任何dml語句前sql%found和sql%notfound的值都是null.在執行dml語句後,sql%

found的屬性值將是:  

. true

:insert  

. true

:delete和update,至少有一行被delete或update.  

. true

:select

into至少返回一行  

當sql%found為true時,sql%notfound為false。  

sql%rowcount

在執行任何dml語句之前,sql%

rowcount的值都是null,對於select into語句,如果執行成功,sql%

rowcount的值為1,如果沒有成功,sql%

rowcount的值為0,

同時產生乙個異常no_data_found.  

這裡邊  

ifsql%notfound

then

exit;  

的含義就是如果沒有記錄被刪除,就退出迴圈,說明刪除結束了。否則,就把成功刪除的記錄加到n_delete上  

SQL SERVER用儲存過程插入大量的資料

sql server儲存過程批量插入資料庫表資料 在做資料庫系統開發時,特別是需要對資料庫操作進行效能測試及優化時,我們就需要在資料庫測試表中插入大量資料以便測試。對於這些資料的插入,這裡通過例項展示如何通過儲存過程進行實現。資料庫表 userinfo 結構如下 createtable dbo us...

oracle大量資料刪除

oracle有個資料表現在已經有2500萬條資料了,軟體用到這個表的資料時就變的特別慢,所以準備把乙個月以前的資料全部清除。我的步驟是 下邊操作都是在plsql中執行的 1 首先 將這個月的資料匯出到乙個臨時表中 這些資料是自己希望保留的 create table temptable as sele...

大量資料分頁儲存過程

create procedure pagination3 tables varchar 1000 表名稱,檢視 primarykey varchar 100 主關鍵字 sort varchar 200 bookid desc 排序語句,不帶order by 比如 newsid desc,orderr...