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 取得集合元素下标的值。

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;  

网页标题:Oracle10g批量绑定forallbulkcollect的方法
文章位置:http://www.csdahua.cn/qtweb/news21/449671.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网