通过bulk collect减少loop处理的开销

采用bulk collect可以将查询结果一次性地加载到collections中。

而不是通过cursor一条一条地处理。

可以在select into,fetch into,returning into语句使用bulk collect。

注意在使用bulk collect时,所有的into变量都必须是collections.

-------------------------------------------------------------------------------------------

简单举个例:

CREATE OR REPLACE TYPE NODETYPE AS OBJECT

(

SEQ       NUMBER(10),

NODE_CODE VARCHAR2(30)

)

/

------------------------------

CREATE OR REPLACE TYPE NODETYPE_LIST AS TABLE OF NODETYPE

/

-------------------------------

FUNCTION GET_QUARTER_OF_MONTH_LIST(P_I_DATE IN VARCHAR2)

RETURN NODETYPE_LIST IS

V_YEAR  VARCHAR2(4);

V_MONTH VARCHAR2(2);

RESULT  NODETYPE_LIST;

BEGIN

V_YEAR  := SUBSTR(P_I_DATE, 1, 4);

V_MONTH := SUBSTR(P_I_DATE, 5, 2);

RESULT  := NODETYPE_LIST();

CASE

WHEN V_MONTH IN ('01', '02', '03') THEN

SELECT NODETYPE(ROWNUM,

TO_CHAR(LAST_DAY(TO_DATE(F_DATE, 'YYYYMMDD')),

'YYYYMMDD')) BULK COLLECT

INTO RESULT

FROM (SELECT V_YEAR || '01' || '01' AS F_DATE

FROM DUAL

UNION ALL

SELECT V_YEAR || '02' || '01' AS F_DATE

FROM DUAL

UNION ALL

SELECT V_YEAR || '03' || '01' AS F_DATE FROM DUAL);

WHEN V_MONTH IN ('04', '05', '06') THEN

SELECT NODETYPE(ROWNUM,

TO_CHAR(LAST_DAY(TO_DATE(F_DATE, 'YYYYMMDD')),

'YYYYMMDD')) BULK COLLECT

INTO RESULT

FROM (SELECT V_YEAR || '04' || '01' AS F_DATE

FROM DUAL

UNION ALL

SELECT V_YEAR || '05' || '01' AS F_DATE

FROM DUAL

UNION ALL

SELECT V_YEAR || '06' || '01' AS F_DATE FROM DUAL);

WHEN V_MONTH IN ('07', '08', '09') THEN

SELECT NODETYPE(ROWNUM,

TO_CHAR(LAST_DAY(TO_DATE(F_DATE, 'YYYYMMDD')),

'YYYYMMDD')) BULK COLLECT

INTO RESULT

FROM (SELECT V_YEAR || '07' || '01' AS F_DATE

FROM DUAL

UNION ALL

SELECT V_YEAR || '08' || '01' AS F_DATE

FROM DUAL

UNION ALL

SELECT V_YEAR || '09' || '01' AS F_DATE FROM DUAL);

WHEN V_MONTH IN ('10', '11', '12') THEN

SELECT NODETYPE(ROWNUM,

TO_CHAR(LAST_DAY(TO_DATE(F_DATE, 'YYYYMMDD')),

'YYYYMMDD')) BULK COLLECT

INTO RESULT

FROM (SELECT V_YEAR || '10' || '01' AS F_DATE

FROM DUAL

UNION ALL

SELECT V_YEAR || '11' || '01' AS F_DATE

FROM DUAL

UNION ALL

SELECT V_YEAR || '12' || '01' AS F_DATE FROM DUAL);

END CASE;

RETURN RESULT;

END;

/

-----------查询结果

SELECT NODE_CODE

FROM TABLE(GET_QUARTER_OF_MONTH_LIST(‘20121015’));

---------结果为:

20121031

20121130

20121231

--------------------------------------------------------------------------

通过上面的测试和分析,我们可以看到Bulk

Collect批查询在某种程度上可以提高查询效率,它首先将所需数据读入内存,然后再统计分析,这样就可以提高查询效率。但是,如果Oracle数据库的内存较小,Shared

Pool Size不足以保存Bulk Collect批查询结果,那么该方法需要将Bulk Collect的集合结果保存在磁盘上,在这种情况下,Bulk

Collect方法的效率反而不如其他两种方法,有兴趣的读者可以进一步测试。

另外,除了Bulk Collect批查询外,我们还可以使用FORALL语句来实现批插入、删除和更新,这在大批量数据操作时可以显著提高执行效率。

oracle中bulk,oracle---bulk collect 的用法相关推荐

  1. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  2. 1.oracle中的exists 和not exists 用法:

    1.oracle中的exists 和not exists 用法: exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1 A1 ...

  3. oracle中submit,Oracle中DBMS_JOB.SUBMIT的用法说明

    Oracle中DBMS_JOB.SUBMIT的用法说明 用法DEMO: DBMS_JOB.SUBMIT(:jobno,//job号 'your_procedure;',//要执行的过程 trunc(s ...

  4. oracle中primary,oracle中如何 Primary key自增

    oracle中如何 Priamry key自增 摸索了一晚上,终于实现了key的自增,现在将实现的过程总结如下: (1)首先创建一个表:这里是我创建的一个User表,包括id,user_name,pa ...

  5. oracle中命令,oracle中常用命令汇总(一)

    1.如何查看Oracle的数据库sid名称? 如果用sysdba身份登录.执行以下命令: SQL> conn / as sysdba; 已连接. SQL> select name from ...

  6. oracle中totimestamp,oracle中to_timestamp和to_date什么区别

    date类型是Oracle常用的日期型变量,时间间隔是秒.两个日期型相减得到是两个时间的间隔,注意单位是"天". timestamp是DATE类型的扩展,可以精确到小数秒(frac ...

  7. oracle中nextday,Oracle日期函数 next_day

    Oracle日期函数 next_day 在Oracle是提供了next_day求指定日期的下一个日期. 语法 : next_day( date, weekday ) date is used to f ...

  8. oracle中isnumeric,Oracle 中 isnumeric 的三种实现

    使用过 asp 的应该对 isnumeric 函数不会陌生,这是一个常用的判断入参是否为数字的函数.在 oracle 中没有现成的判断是否为数字函数,下面就用三种方法来实现: 1. 利用 to_num ...

  9. oracle中pdb,Oracle 12C新特性-CDB和PDB 详解

    最近看到好多人都在尝试Oracle中的12C新特性-容器数据库,今年3月Orcle推出了Release2版本,可以算是一个稳定版本了.下午着手尝试了一下,还是蛮不错得 1.前言 CDB与PDB是Ora ...

  10. Oracle 中使用 fetch bulk collect into 批量效率的读取

    http://www.jzxue.com/shujuku/oracle/201109/21-8976.html 通常我们获取游标数据是用 fetch some_cursor into var1, va ...

最新文章

  1. [MySQL FAQ]系列 -- 为何innodb表select count(*)很慢
  2. [mmu/cache]-ARM cache的学习笔记-一篇就够了
  3. 再Repeater模板中,如何获取里面的控件 客户端ID ??
  4. Tensorflow保存模型详解(进阶版二):如何保存最近的.ckpt文件 及 如何分开保存.ckpt数据文件和.meta图文件
  5. RPM 包相关命令详解
  6. 【C语言】《程序设计基础(C语言)》自编题解索引
  7. 优步杭州推出顺路接单功能,不久将向全国开放!
  8. python3GUI--浏览器By:PyQt5(附源码)
  9. dex转java工具_安卓dex反编译工具(dex-translator)
  10. 华为手机备份的通讯录是什么文件_华为手机怎样备份手机通讯录(教你微信如何备份手机通讯...
  11. 《老友记》第一季第二集精读笔记
  12. 麻木的IT公民:293个公司人压力和心理调查
  13. 条件覆盖,路径覆盖,语句覆盖
  14. 计算机学院方阵入场词,运动会入场方队解说词
  15. vue中使用CSS预处理器
  16. 一万一千字!结合代码超详细讲解SQL执行流程(二)!干货到底!建议收藏!
  17. 小白学习老九君C++笔记(10) 使用类创建对象
  18. Python 编写 excel 点名软件
  19. 虚拟机+Ubuntu18.04+ORB_SLAM3+ROS环境配置(配置环境的过程以及途中出现的错误,解决方法)
  20. 如何删除掉word中多加的分页符?

热门文章

  1. 喜马拉雅三战IPO: “声“意难做、4年累亏近30亿
  2. 链表OJ2——倒数第K个结点-分割链表,回文链表,相交链表,环形链表和随机指针链表深拷贝问题
  3. C++ Primer Plus P125~P200
  4. 解决Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1的一种方法
  5. 【ECharts系列|03可视化大屏】大数据管理平台实时展示
  6. shell pwd 和 dirname 讲解
  7. 快速识别网络钓鱼攻击的迹象
  8. 作为一名高级程序员应该掌握哪些技术
  9. android---多点触控
  10. 需求工程:软件建模与分析 读书笔记二