情景一:
刪除primary_index_test表中,mindex_id欄位為空的資料
情景二:
刪除virtual_card_test表中的髒資料
情景一的解決方案:
情景二的解決方案:
分析:情景二無法使用情景一那樣,where後面直接加條件,只能根據主鍵來進行刪除。
2018/12/10
方案1:使用快速游標法(刪除一次提交一次);
1--快速游標法
2begin
3for temp_cursor in (selectid4
from
virtual_card3
5where instr(name, '
*') >06
union
7selectid8
from
virtual_card3
9where instr(name, '
#') >010
union
11select
id12
from
virtual_card3
13where instr(name, '
/') >014
union
15select
id16
from
virtual_card3
17where instr(name, '
+') >018
union
19select
id20
from
virtual_card3
21where instr(name, '
!') >022
union
23select
id24
from
virtual_card3
25where instr(name, '
.') >
0) loop
26/*
loop迴圈的是temp_cursor(逐條讀取temp_cursor)
*/27
delete
from virtual_card3 where virtual_card3.id =
temp_cursor.id;
28commit; --
提交29
方案3:使用儲存過程按id進行逐條刪除。
1建立並執行該儲存過程create
orreplace
procedure delete_table_batch(v_rows in
number
/*刪除多少條資料後進行提交
*/) is2/*
*3* 內容:
4* 日期:2018/12/0556
* 版本:1.07*/
8 i number(10); --
宣告變數,用於記錄次數
9begin
10for temp_table in (select
id11
from
virtual_card_test
12where instr(name, '
*') >013
union
14select
id15
from
virtual_card_test
16where instr(name, '
#') >017
union
18select
id19
from
virtual_card_test
20where instr(name, '
/') >021
union
22select
id23
from
virtual_card_test
24where instr(name, '
+') >025
union
26select
id27
from
virtual_card_test
28where instr(name, '
!') >029
union
30select
id31
from
virtual_card_test
32where instr(name, '
.') >
0) loop
33/*
loop迴圈的是temp_table(逐條讀取temp_table)
*/34
delete virtual_card_test where virtual_card_test.id =
temp_table.id;
35 i := i +
1; --
刪除一次,+1
36if i >= v_rows then
37commit; --
提交38 i :=
0; --
重置39
endif;40
endloop;
41exception
42/*
輸出異常資訊
*/43
when others then
44 dbms_output.put_line('
異常編號:'||
sqlcode);
45 dbms_output.put_line('
異常資訊:'||
sqlerrm);
46rollback; --
回滾47
end delete_table_batch;
刪除16522條資料,用了6分21秒,比方式一慢太多了。
方案4:
將要保留的資料插入到新錶
1刪除原來的表--將要保留的資料插入到新錶
2create
table virtual_card_temp2 as(3
select*4
from
virtual_card2
5where instr(name, '
*') =06
and instr(name, '
#') =07
and instr(name, '
/') =08
and instr(name, '
+') =09
and instr(name, '
!') =010
and instr(name, '
.') =
0)
--將新建的表進行重新命名成刪除表的名稱。刪除原表
drop
table virtual_card2
說明:原來的表有過存在外來鍵約束等關係時,並沒有進行測試,因為該錶沒有索引之類東西,自己測試的時候一定要慎重!!!
oracle 批量刪除表資料的4種方式
情景一 刪除primary index test表中,mindex id欄位為空的資料 情景二 刪除virtual card test表中的髒資料 情景一的解決方案 情景二的解決方案 分析 情景二無法使用情景一那樣,where後面直接加條件,只能根據主鍵來進行刪除。2018 12 10 方案1 使用...
oracle 批量刪除表資料的4種方式
情景一 刪除primary index test表中,mindex id欄位為空的資料 情景二 刪除virtual card test表中的髒資料 情景一的解決方案 情景二的解決方案 分析 情景二無法使用情景一那樣,where後面直接加條件,只能根據主鍵來進行刪除。2018 12 10 方案1 使用...
oracle批量刪除表
如下 declare 定義臨時變數用於儲存每一條刪除sql tmp sql varchar2 4000 定義游標變數用於儲存所有的刪除sql cursor drop sql is 查詢拼接出所有刪除sql select drop table table name from user tables w...