日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Oracle10g批量綁定forallbulkcollect的方法

以下的文章主要是介紹Oracle 10g來批量綁定forall bulk collect的具體方法,我們大家都知道批量綁定一般的情況下是通過減少在PL/SQL與SQL引擎之間的上下文切換(context switches )以此提高性能,批量綁定(Bulk binds)主要包括:

(1) Input collections, use the FORALL statement,用來改善DML(INSERT、UPDATE和DELETE) 操作的性能。

(2) Output collections, use BULK COLLECT clause,用來提高查詢(SELECT)的性能。

Oracle 10g開始forall語句可以使用三種方式:

in low..up

in indices of collection 取得集合元素下標(biāo)的值。

in values of collection 取得集合元素的值。

forall語句還可以使用部分集合元素。

sql%bulk_rowcount(i)表示forall語句第i元素所作用的行數(shù)。

 
 
 
  1. --drop table blktest;  
  2. --CREATE TABLE blktest (num NUMBER(20), name varchar2(50));  
  3. --CREATE OR REPLACE PROCEDURE p_bulktest IS  
  4. DECLARE  
  5. TYPE type_num IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;  
  6. TYPE type_name IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;  
  7. tab_num type_num;  
  8. tab_name type_name;  
  9. t1 NUMBER;  
  10. t2 NUMBER;  
  11. t3 NUMBER;  
  12. BEGIN  
  13. FOR i IN 1 .. 500000 LOOP  
  14. tab_num(i) := i;  
  15. tab_name(i) := 'name: ' || to_char(i);  
  16. END LOOP;  
  17. SELECT dbms_utility.get_time      
  18. INTO t1      
  19. FROM dual;  
  20. FOR i IN 1 .. 500000 LOOP  
  21. INSERT INTO blktest         
  22. VALUES  
  23. (tab_num(i), tab_name(i));  
  24. END LOOP;  
  25. SELECT dbms_utility.get_time      
  26. INTO t2      
  27. FROM dual;  
  28. FORALL i IN 1 .. 500000  
  29. INSERT INTO blktest         
  30. VALUES  
  31. (tab_num(i), tab_name(i));  
  32. SELECT dbms_utility.get_time      
  33. INTO t3      
  34. FROM dual;  
  35. dbms_output.put_line('Execution Time(S)');  
  36. dbms_output.put_line('-------------------');  
  37. dbms_output.put_line('FOR loop: '   
  38. || to_char((t2 - t1) / 100));  
  39. dbms_output.put_line('FORALL:  '   
  40. || to_char((t3 - t2) / 100));  
  41. END;  
  42. /*  
  43. Execution Time(S)  
  44. FOR loop: 32.78  
  45. FORALL:  2.64  
  46. */  
  47. /*  

bulk collect 語句

用于取得批量數(shù)據(jù),只適用于select into ,fetch into 及DML語句的返回子句

 
 
 
  1. DECLARE  
  2. TYPE type_emp IS TABLE OF   
  3. scott.emp%ROWTYPE INDEX BY BINARY_INTEGER;  
  4. tab_emp type_emp;  
  5. TYPE type_ename IS TABLE OF   
  6. scott.emp.ename%TYPE INDEX BY BINARY_INTEGER;  
  7. tab_ename type_ename;  
  8. CURSOR c IS  
  9. SELECT *  
  10. FROM scott.emp;  
  11. BEGIN  
  12. SELECT * BULK COLLECT  
  13. INTO tab_emp  
  14. FROM scott.emp;  
  15. FOR i IN 1 .. tab_emp.COUNT LOOP  
  16. dbms_output.put_line(tab_emp(i).ename);  
  17. END LOOP;  
  18. dbms_output.new_line;  
  19. DELETE scott.emp RETURNING   
  20. ename BULK COLLECT INTO tab_ename;  
  21. FOR i IN 1 .. tab_emp.COUNT LOOP  
  22. dbms_output.put_line(tab_emp(i).ename);  
  23. END LOOP;  
  24. ROLLBACK;  
  25. OPEN c;  
  26. FETCH c BULK COLLECT  
  27. INTO tab_emp;  
  28. dbms_output.new_line;  
  29. FOR i IN 1 .. tab_emp.COUNT LOOP  
  30. dbms_output.put_line(tab_emp(i).sal);  
  31. END LOOP;  
  32. END;  
  33. */  

 

批量輸入FORALL+批量輸出BULK

DECLARE,批量輸入FORALL+批量輸出BULK
 

 
 
 
  1. TYPE type_num IS TABLE OF NUMBER;  
  2. tab_1 type_num;  
  3. tab_2 type_num;  
  4. BEGIN  
  5. tab_1 := type_num(1, 2, 3);   
  6. FORALL i IN 1 .. tab_1.COUNT   
  7. --EXECUTE IMMEDIATE 'update t2 set idid2=id*2   
  8. where id=:1 returning id2 into :2'   
  9. --USING tab_1(i) RETURNING BULK COLLECT INTO tab_2;  
  10. update t2 set idid2=id*2 where id=tab_1(i)   
  11. returning id2 bulk collect into tab_2;  
  12. FOR i IN 1 .. tab_2.COUNT LOOP  
  13. dbms_output.put_line(tab_2(i));  
  14. END LOOP;  
  15. END;  

當(dāng)前名稱:Oracle10g批量綁定forallbulkcollect的方法
路徑分享:http://www.5511xx.com/article/dhhisdo.html