oracle批量繫結的概念

2021-04-15 21:09:42 字數 4153 閱讀 7170

oracle9i

開始,oracle

forall

和bulk collect

通過批量繫結技術,極大地加快了資料的處理速度。在不使用批量繫結的時候,為了將巢狀表中的資料插入資料庫表中,需要迴圈執行

insert

語句,而使用

forall

insert

中執行,從而加快了執行速度。

bulk collect

子句用於取得批量資料,該子句只能用於

select

語句、fetch

語句和dml

返回子句中;而

forall

語句只適用於執行批量的

dml操作。

declare

type

id_table_type

istable

ofnumber(6

) index

bybinary_integer;

type

name_table_type

istable

ofvarchar2(10

) index

bybinary_integer;

id_table id_table_type;

name_table name_table_type;

start_time

number(10

); end_time

number(10

); begin

fori in1..

100000

loop

id_table(i) := i;

name_table(i) :=

'name'

||i;

endloop;

delete

from

demo;

start_time := dbms_utility.get_time;

fori in1..

100000

loop

insert

into

demo

values

(id_table(i),name_table(i));

endloop;

end_time := dbms_utility.get_time;

dbms_output.put_line(''

||to_char((end_time-start_time)/

100));

delete

from

demo;

start_time := dbms_utility.get_time;

forall

i in1..

100000

insert

into

demo

values

(id_table(i),name_table(i));

end_time := dbms_utility.get_time;

dbms_output.put_line(''

||to_char((end_time-start_time)/

100));

end;

在oracle9i中,當使用forall語句時,必須具有連續的元素;從10g開始,通過使用indices of子句和values of子句,可以使用不連續的集合元素,這裡forall跟for不一樣的是它並不是乙個迴圈語句。從10g開始,forall的語句有三種執行語法:

lforall index in lower_bound..upper_bound sql_statement; 其中index是隱含定義的整數變數,lower_bound和upper_bound為集合元素的上下限。

lforall index in indices of collection [between lower_bound..upper_bound] sql_statement;其中collection為巢狀表名稱,這裡只取巢狀表collection中下標位於lower_bound和upper_bound之間的非空元素值。

lforall index in values of index_collection sql_statement; 其中index_collection為儲存下標的集合變數,就是說本集合變數的內容為要取的集合collection的下標,例如(2,3,5)。

另外,為了記錄forall更新的行數,特別定義了sql%bulk_rowcount,使用方法如下。

declare

type

test_table_type

istable

ofvarchar2

(100);

test_table test_table_type := test_table_type(

'name2'

,'name'

,'asdf');

begin

forall

i in

1..test_table.

count

update

demo

setname

= 'zhanglei'

where

name

= test_table(i);

dbms_output.put_line(

'第二個元素更新的行數:'||

sql%

bulk_rowcount(1

));

dbms_output.put_line(

'第二個元素更新的行數:'||

sql%

bulk_rowcount(2

));

dbms_output.put_line(

'第二個元素更新的行數:'||

sql%

bulk_rowcount(3

));

end;

bulk collect子句用於取得批量資料,它只適用於select into語句,fetch into語句和dml返回子句。語法為 select * bulk collect into collection_name …其中collection_name為集合名稱。

declare

type

test_table_type

istable

ofvarchar2(20

) index

bybinary_integer;

test_table test_table_type;

begin

select

name

bulk

collect

into

test_table

from

demo

where

name

= 'zhanglei';

fori in1

..test_table.

count

loop

dbms_output.put_line(test_table(i));

endloop;

end;

bulk collect子句的另外乙個使用環境就是在dml的返回子句中,執行dml操作會改變資料庫資料,為了取得dml操作改變的資料,可以使用returning子句,為了取得dml所作用的多行資料,則需要使用bulk collect子句。

declare

type

test_table_type

istable

ofvarchar2(20

) index

bybinary_integer;

test_table test_table_type;

begin

delete

from

demo

where

name

= 'zhanglei'

returning

name

bulk

collect

into

test_table;

fori in

1..test_table.

count

loop

dbms_output.put_line(test_table(i));

endloop;

end;

oracle 復合資料型別(批量繫結)2

一 pl sql集合 為了處理單列多行,可以使用pl sql集合進行處理。pl sql集合類似於高階語言陣列的一種復合資料型別 集合型別包括索引表 pl sql表 巢狀表 netsed table 變長陣列 varray 等三種型別。1 索引表 索引表也成為pl sql表,它是oracle早期用來處...

c 資料繫結概念

資料繫結概念 想到資料繫結的時候應該考慮到 在資料來源和資料繫結控制項之間的資料流的方向和資料流什麼時候發生。對於單向資料繫結來說,資料只在乙個方向上流動,來自資料來源的屬性值被放進使用者介面控制項的屬性中,但是當控制項中的這個屬性值發生了改變以後,資料是不會從控制項流回資料來源的。至於雙向資料繫結...

oracle變數繫結

一 游標 游標可以理解為sql語句的乙個控制代碼,也叫sql語句的指標,游標指向一條sql語句,oracle會話要執行一條sql時,首先要開啟游標。二 sql解析的過程 硬解析步驟 1.對sql語句進行語法檢查,看是否有語法錯誤 2.通過資料字典,檢查sql語句中涉及的物件和列是否存在 3.檢查sq...