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