Oracle PL/SQL (6) - 集合運(yùn)算符、FORALL、BULK COLECT使用

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容