1、集合運(yùn)算符的使用
set操作符用于取消特定嵌套表中的重復(fù)值。
DECLARE
TYPE my_array_type IS TABLE OF VARCHAR2(50) not null;
my_array1 my_array_type:=my_array_type(2,4,3,1,2);
my_array2 my_array_type;
my_array3 my_array_type:=my_array_type();
my_array4 my_array_type:=my_array_type('beijing','shanghai','wuhan');
my_array5 my_array_type:=my_array_type('beijing','java');
my_array6 my_array_type:=my_array_type('beijing','shanghai');
v_str varchar2(10):=4;
BEGIN
my_array2 :=set(my_array1);
FOR i in 1..my_array2.count LOOP
dbms_output.put_line(' '||my_array2(i));-- 輸出 2 4 3 1
END LOOP;
dbms_output.put_line('集合中所有元素的個(gè)數(shù)為: '||CARDINALITY(my_array1));--輸出 5
-- empty運(yùn)算符
if my_array2 is not empty then
dbms_output.put_line('my_array2是不是空集合! ');
end if;
if my_array3 is empty then
dbms_output.put_line('my_array3是一個(gè)空集合! ');
end if;
--member of 運(yùn)算符
if v_str member of my_array2 then
dbms_output.put_line('my_array2中包含數(shù)字! '||v_str);
end if ;
--multiset except 以my_array4集合為參考,刪除與my_array5中相同的部分
my_array3:=my_array4 multiset except my_array5;
FOR i in 1..my_array3.count LOOP
dbms_output.put_line(' '||my_array3(i));-- 輸出 shanghai wuhan
END LOOP;
--multiset intersect 保留兩個(gè)集合中相同的部分
my_array3:=my_array4 multiset intersect my_array5;
FOR i in 1..my_array3.count LOOP
dbms_output.put_line(' '||my_array3(i));-- 輸出 beijing
END LOOP;
-- multiset union 將兩個(gè)集合的數(shù)據(jù)合并在一起
my_array3:=my_array4 multiset union my_array5;
FOR i in 1..my_array3.count LOOP
dbms_output.put_line(' '||my_array3(i));-- 輸出 beijing shanghai wuhan beijing java
END LOOP;
-- submultiset 判斷一個(gè)集合是否為另一個(gè)集合的子集
if my_array6 submultiset my_array4 then
dbms_output.put_line('my_array6集合是my_array4的子集。 ');
end if;
END;
2、使用FORALL批量綁定
當(dāng)使用PL/SQL執(zhí)行一條更新語(yǔ)句時(shí),SQL會(huì)將執(zhí)行更新的數(shù)據(jù)返回給PL/SQL,這樣用戶才可以取得更新后的數(shù)據(jù)。但是要進(jìn)行大量的數(shù)據(jù)操作時(shí),這種方式就會(huì)使程度的執(zhí)行性能大大降低。
如:通過(guò)PL/SQL程序快執(zhí)行多條數(shù)據(jù)的更新操作。
declare
type user_array is varray(10) of user.userno%type;
v_userno user_array :=user_array(222,333,444,555,666);
begin
for x in v_userno.first .. v_userno.last loop
update user set username='AAA' where userno=v_userno(x);
end loop;
end;
但是使用FORALL語(yǔ)句,記錄集合中要用于更新操作的數(shù)據(jù),記錄完成之后向數(shù)據(jù)庫(kù)中一次性發(fā)出多條更新語(yǔ)句。更新完成之后,可以使用SQL%BULK_ROWCOUNT(x)取得操作中所影響的數(shù)據(jù)行數(shù)。
FORALL語(yǔ)句語(yǔ)法:
FORALL 變量 IN 集合初值..集合最高值 SQL語(yǔ)句
declare
type user_array is varray(10) of user.userno%type;
v_userno user_array :=user_array(222,333,444,555,666);
begin
forall x in v_userno.first..v_userno.last
update user set username='AAA' where userno=v_userno(x);
for x in v_userno.first .. v_userno.last loop
dbms_output.put_line('用戶'||v_userno(x)||'更新數(shù)據(jù)受影響的行數(shù)為:'||SQL%BLUK_ROWCOUNT(x));--SQL%BULK_ROWCOUNT(x)取得更新操作影響的行數(shù)
end loop;
end;
3、BULK COLLECT 批量接收數(shù)據(jù)
上面例子中使用FORALL語(yǔ)句可以一次性向數(shù)據(jù)庫(kù)中發(fā)出多條SQL語(yǔ)句,而使用BULK COLLECT 可以一次性從數(shù)據(jù)庫(kù)中取出多條數(shù)據(jù)。
declare
type claimno_varray is varray(5) of claim.claimno%type;
v_claimno claimno_varray;
begin
select claimno bulk collect into v_claimno from claim where acc_no='claim01';
for i in v_claimno.first .. v_claimno.last loop
dbms_output.put_line('定損單號(hào):'||v_claimno(i));
end loop;
end;
輸出結(jié)果:
定損單號(hào):claim01_05
定損單號(hào):claim01
declare
v_acc_no emb.claim.acc_no%type;
type varray_claimno is varray(5) of emb.claim.claimno%type;
type varray_amount is varray(5) of emb.claim.estimate_amt%type;
v_claimno varray_claimno:=varray_claimno();
v_amount varray_amount:=varray_amount();
begin
v_acc_no:='claim01';
select t.claimno,t.estimate_amt
bulk collect into v_claimno, v_amount
from claim t where t.acc_no = v_acc_no;
/*輸出定損單信息*/
for v_index in v_claimno.first .. v_claimno.last loop
dbms_output.put_line('定損單號(hào):'||v_claimno(v_index)||' 定損總金額:'||v_amount(v_index));
end loop;
end;
輸出結(jié)果:
定損單號(hào):claim01_05 定損總金額:73446
定損單號(hào):claim01 定損總金額:128327
以上只是取出表中的一部分字段 數(shù)據(jù)進(jìn)行保存。實(shí)際也可以結(jié)合嵌套表將多個(gè)字段的數(shù)據(jù)一起保存。
declare
type company_array is table of emb.company%rowtype;
v_company company_array;
begin
select * bulk collect into v_company from company;
for i in v_company.first .. v_company.last loop
dbms_output.put_line('公司code:'||v_company(i).company_code||' 公司名稱:'||v_company(i).company_name||' 公司等級(jí):'||v_company(i).company_level);
end loop;
end;
輸出結(jié)果:
公司code:10001 公司名稱:總2公司 公司等級(jí):1
公司code:2025 公司名稱:深圳2分公司 公司等級(jí):2
公司code:333 公司名稱:測(cè)試分公司 公司等級(jí):2