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

数据库 Oracle
我们今天主要和大家介绍的是Oracle 10g来批量绑定forall bulk collect的具体方法,如果你对其感兴趣的话,你就可以点击阅读以下的文章了。

以下的文章主要是介绍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;  

 

责任编辑:佚名 来源: 互联网
相关推荐

2010-04-16 09:11:53

应用FORALL

2011-09-02 14:18:53

OracleBULK COLLECFORALL

2011-08-10 14:06:19

Oracle 10g双网卡绑定RAC

2010-04-14 16:09:51

Oracle 10g归

2011-07-27 14:22:41

Oracle 10g DBA账户

2011-08-23 18:04:16

Oracle 10g数据泵

2010-03-30 19:31:25

Oracle 10g

2011-05-13 11:21:51

linuxoracle 10g安装

2011-03-25 16:10:58

oraclenagios

2010-09-08 08:44:30

SQL Server

2011-08-09 18:15:24

Oracle 10g查找数据

2009-04-27 13:26:41

Oracle 10gRAC链接错误

2010-05-07 09:35:25

Oracle 10g

2011-04-15 09:53:37

Oracle 10gSQL优化

2010-04-07 09:39:18

Oracle 10G

2009-11-19 10:32:41

Oracle 10g服

2010-04-13 10:07:19

Oracle 10G

2011-08-30 15:28:33

Oracle 10g表

2009-10-26 13:54:29

Oracle 10g用

2010-05-07 16:40:45

Oracle 10g
点赞
收藏

51CTO技术栈公众号