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...