利用隱式遊標分批刪除資料的procedure
剛一個人在南京過完了元宵佳節,和同學去了一趟書店幫他選了一本三思的塗抹oracle,個人來看對他還是很不錯的,不然直接看eygle的深入淺出 dba3手記那是太吃力了,塗抹oracle還是很不錯的,至少能認認真真把那本書啃完是非常受益的。
即將迎來自己的未知的第二份工作,當然首先必須跟oracle相關,如果可以有管理類的工作那最好了,不過自己在技術和經驗方面還存在遠遠不足,雖然這一年來自己很努力的去肯文件 做測試但是知識漏洞還是太多太多。
不瞎扯了,同事這些天需要刪除大量的資料,如果直接刪除對回滾段衝擊太大,一個執行半天delete很可能因為ora-01555而以悲劇告終。分批批次刪除提交則可以很有效的避免ora-01555錯誤而高效的刪除大量資料。
Sql>Select count(*) from test_objects01;
Count(*)
3330987
Sql>select count(*) from test_objects01 where object_id<63792;
Count(*)
697867
此時需要只保留object_id>=63792,當然由於刪除資料較多,可以利用create table test01保留不需要刪除的資料,然後truncate原表段,再insert到test_object01中。
不過需要保留的資料依然佔用很大比例,就不適用了!還是利用遊標的特性來對批次刪除進行控制吧!
Create or replace procedure del_proc01
As
Begin
loop
Delete from test01 where object_id<=63792 and rownum<=100000;
Exit when sql%notfound;--dml語句中隱式遊標屬性進行控制
Commit;
End loop;
Commit;
End;
/
注意dml語句中才存在隱式遊標,利用常用的sql%found sql%notfound sql%rowcount sql%isopen(隱式遊標中isopen查詢任何時間都返回false,所以一般不用於控制迴圈)。
同樣也可以利用sql%rowcount來控制迴圈。
Create or replace procedure del_proc02
As
Begin
Loop
Delete from test01 where object_id<=63792 and rownum<=100000;
Exit when sql%rowcount=0;
Commit;
End loop;
Commit;
End;
/
這裡摘要以下eygle的blog關於批次刪除的一個procedure,和上述自己所寫procedure加入了引數控制table_name 、where檢索條件、rownum批次刪除行數,然後後續輸出刪除的行數。(關於for all刪除的可實現性還未有清晰的理解)
SQL> create or replace procedure delBigTab
2 (
3 p_TableName in varchar2,
4 p_Condition in varchar2,
5 p_Count in varchar2
6 )
7 as
8 pragma autonomous_transaction;
9 n_delete number:=0;
10 begin
11 while 1=1 loop
12 EXECUTE IMMEDIATE
13 'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'
14 USING p_Count;
15 if SQL%NOTFOUND then
16 exit;
17 else
18 n_delete:=n_delete + SQL%ROWCOUNT;
19 end if;
20 commit;
21 end loop;
22 commit;
23 DBMS_OUTPUT.PUT_LINE('Finished!');
24 DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
25 end;
26 /
[@more@]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1057288/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle大資料量分批刪除Oracle大資料
- oracle delete 分批刪除Oracledelete
- Oracle使用cursor for隱式遊標Oracle
- 利用Logmnr找回誤刪除的資料
- PLSQL 呼叫 返回 遊標(Cursor)PROCEDURESQL
- 一個利用遊標返回資料集的例子
- 【piner】利用Logmnr找回誤刪除資料
- 利用Logmnr找回誤刪除資料(zt)
- Laravel 中利用『模型事件』來實現刪除資料時的連帶刪除Laravel模型事件
- 利用rman全備恢復刪除的資料庫資料庫
- sql server編寫archive通用模板指令碼實現自動分批刪除資料SQLServerHive指令碼
- 【PL/SQL 學習】隱式遊標學習SQL
- 查詢已經刪除的procedure,view,functionViewFunction
- whk我【資料刪除】你個【資料刪除】的
- 實驗2:利用BBED工具刪除行資料
- 實驗1:利用BBED工具恢復刪除的資料行
- 刪除資料
- 隱式遊標(implicit cursor)_sql%found_rowcount小操作SQL
- 刪除WinXP隱藏的元件(轉)元件
- indexedDB 刪除資料Index
- Solr刪除資料Solr
- 刪除elasticsearch資料Elasticsearch
- 大量刪除資料的速度
- Laravel 資料庫裡的資料刪除Laravel資料庫
- 批量刪除Oracle資料庫的資料Oracle資料庫
- MongoDB 資料庫建立刪除、表(集合)建立刪除、資料增刪改查MongoDB資料庫
- 資料夾刪除不掉怎麼辦?資料夾無法刪除
- win10如何刪除隱藏軟體_win10刪除隱藏軟體的方法Win10
- 資料夾刪除不了怎麼辦?資料夾刪除不了的解決方法
- CnosDB的資料更新和刪除
- 刪除不掉的資料記錄
- 批量刪除空的資料夾
- 資料刪除慢的原因排查
- MySQL刪除資料表MySql
- indexedDB 刪除資料庫Index資料庫
- 刪除重複資料
- MongoDB之資料刪除MongoDB
- 刪除大表資料