oracle 批量刪除表資料的4種方式

2021-09-07 20:39:53 字數 3982 閱讀 7842

情景一:

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