程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle 10g批量綁定forall bulk collect的方法

Oracle 10g批量綁定forall bulk collect的方法

編輯:Oracle數據庫基礎

以下的文章主要是介紹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 取得集合元素下標的值。

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

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

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

  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 語句

用於取得批量數據,只適用於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;  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved