下面我们来看两个范例,一个是使用BULK COLLECT的,一个没有:

范例1、使用多次循环来检索并显示数据。

范例2、一次性获取数据,然后再循环显示。

下面是一些有关BULK COLLECT的建议:

1、从Oracle9i开始,你都可以在静态SQL和动态SQL中使用BULK COLLECT。

2、你可以在任何地方的SELECT INTO,FETCH INTO,和RETURNING INTO子句中使用BULK COLLECT关键字。

3、在Oracle9i以前,你引用的集合变量只能够存储标量值(字符串、数字和日期)。换句话说,你不能提取一条记录存放到一个记录型的数据结构中(这个数据结构是一个集合变量中的一行记录)。

4、SQL引擎会自动地初始化和扩展你在BULK COLLECT子句中引用的集合变量。它会从索引1开始,连续地把记录填充进集合中,并且会重写任何以前定义了的数据。

5、你不能在一个FORALL语句中使用SELECT...BULK COLLECT语句。

6、如果找不到任何记录,SELECT...BULK COLLECT也不会产生NO_DATA_FOUND异常。相应地,你必须检查集合的内容,以察看里面是否有数据。

7、在执行查询以前,BULK COLLECT操作会清空在INTO子句中引用的集合。如果查询没有返回任何记录,这个集合的COUNT方法就会返回0。

如果对于Oracle9i或以上的版本,我们把上面的例子写得更简单一些:

create or replace procedure Bulk_Demo2(i_deptno in number) is

type t_tbl1 is table of emp%ROWTYPE index by binary_integer;

emp_info1 t_tbl1;

type emp_rec is record(

empno emp.empno%type,

ename emp.ename%type);

type t_tbl2 is table of emp_rec index by binary_integer;

emp_info2 t_tbl2;

begin

Select t.* BULK COLLECT

INTO emp_info1

From emp t

Where t.deptno = i_deptno;

Dbms_Output.put_line('------批量存放整行记录类型-------');

For i in 1 .. emp_info1.count Loop

Dbms_Output.put_line(emp_info1(i).empno || ' ' || emp_info1(i)

.ename || ' ' || emp_info1(i)

.job || ' ' || emp_info1(i)

.sal || ' ' || emp_info1(i).hiredate);

End Loop;

Dbms_Output.put_line('+++++++++++++++++++++++++++++++++++++++');

Dbms_Output.put_line('------批量存放自定义记录类型-------');

select t.empno, t.ename BULK COLLECT

INTO emp_info2

From emp t

Where t.deptno = i_deptno;

For i in 1 .. emp_info2.count Loop

Dbms_Output.put_line(emp_info2(i).empno ||' '|| emp_info2(i).ename);

End Loop;

Dbms_Output.put_line('++++++++++++++++++++++++++++++++++++++');

end BULK_demo2;

运行结果:

1.1.1.1限制BULK COLLECT提取的记录数目

Oracle对于BULK COLLECT提供了一个LIMIT关键字来让你限制从数据库检索出来的记录数目。语法如下:

FETCH cursor BULK COLLECT INTO ... [LIMIT rows];

这里的rows参数可以是一个字面值,变量或者是表达式——都指向一个整数(不然的话,Oracle将会给出一个VALUE_ERROR的异常信息)。

LIMIT对于BULK COLLECT来说是非常有用的。它帮助你清楚地了解并管理程序所用到过程数据。比如说,你要精确地查询并处理1000条记录。你可以使用BULK COLLECT来取出这些记录,并且残生了一个相对较大的集合。但是这种方法会消耗许多PGA(全局进程区)内存。如果这个代码是被很多独立的会话使用,那么你的应用就会因为PGA频繁的页面交换而效率低下。

下面的这段代码(在Oracle9i的HR模式下),在FETCH语句中使用了LIMIT语句。请注意,这里使用了集合的COUNT方法来确认是否有数据被取出。而%FOUND和%NOTFOUND属性在这里就不能用来检测是否有数据被取出。

create or replace procedure LimitDemo is

CURSOR allrows_cur IS

SELECT employee_id FROM employees;

TYPE employee_aat IS TABLE OF

employees.employee_id%Type INDEX BY BINARY_INTEGER;

l_employees employee_aat;

begin

OPEN allrows_cur;

Loop

EXIT WHEN allrows_cur%NOTFOUND;

FETCH allrows_cur BULK COLLECT

INTO l_employees LIMIT 100;

Dbms_Output.put_line(l_employees.count);

end loop;

close allrows_cur;

end LimitDemo;

获得结果是:

oracle bulk collect into,BULK COLLECT INTO相关推荐

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

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

  2. Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据

    通常我们获取游标数据是用 fetch some_cursor into var1, var2 的形式,当游标中的记录数不多时不打紧.然而自 Oracle 8i 起,Oracle 为我们提供了 fetc ...

  3. bulk插入 es_elasticsearch的helpers.bulk和es_client.bulk的用法

    from elasticsearch import Elasticsearch import datetime es_client = Elasticsearch(["127.0.0.1:9 ...

  4. bulk插入 es_ElasticSearch的Bulk操作 ES bulk详解

    elasticsearch bulkApi是什么?和普通的CURD区别在哪里? 1.可以批量对多个索引进行增加或者删除等操作,减少网络请求次数,可以显著的提高索引的速度. 2.CURD只能对单条数据进 ...

  5. es bulk java_Java Elasticsearch Bulk API 批量操作

    ES的Bulk API主要用于在单个请求中,批量执行创建.更新.删除文档操作,避免循环发送大量的ES请求. 创建BulkRequest对象 BulkRequest request = new Bulk ...

  6. oracle bulk collect

    碰到的问题,有一个员工表,存储着员工的各种信息. 我要写一个过程,传进去员工的名字,打印该员工的信息. create or replace procedure getInfo(name emp.ena ...

  7. PostgreSQL Oracle 兼容性之 - PL/SQL FORALL, BULK COLLECT

    Oracle PL/SQL 开发的童鞋,一定对O家的bulk批量处理的性能很是赞赏吧. 但是PostgreSQL用户请不要垂涎,作为学院派和工业界的一颗璀璨明珠. 开源数据库PostgreSQL,也有 ...

  8. bulk怎么使用oracle,oracle学习之bulk collect用法

    通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率 Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使 ...

  9. PL/SQL批处理语句:BULK COLLECT 和 FORALL

    PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理,这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换,每次却换时,都有额外的开销        请看下图 ...

最新文章

  1. /* * 编程题第四题(20分): 用1元5角钱人名币兑换5分、2分和1分的硬币(每一种都要有)共一百枚,问共有几种兑换方案?并输出每种方案。 */
  2. MyBatis DAO层开发——Mapper动态代理方式
  3. 给爸妈最硬核的春节礼物,走入百度大字版APP研发幕后
  4. 测试Live Writer
  5. C++多线程快速入门(一):基本常用操作
  6. 混合云模式助力斗鱼搭建混搭大数据架构
  7. Centos7 安装Go环境
  8. 1,日志组件XLog
  9. 计算机分级无法度量视频,雨林木风win7旗舰版电脑评分时出现无法度量视频播放性能...
  10. Android和iOS智能机去年出货超7亿 同比增长46%
  11. logrotate日志管理工具
  12. Java接受带文件的表单,Javaweb使用getPart来接收表单文件
  13. C语言如何求球的体积和表面
  14. 【教程】批量删除B站抽奖动态
  15. win策略计算机配置,BGinfo配置策略(Server2012R2-Win10)
  16. EOS智能合约开发系列(四)
  17. 计算机网络三级考试题型,计算机三级网络技术考试题型分析
  18. Linux Centos7 搭建简易堡垒机安装jailkit实现chroot
  19. 聊聊 Kafka:协调者 GroupCoordinator 源码剖析之 FIND_COORDINATOR
  20. 实习时候的亚子==(四)

热门文章

  1. Diary(八)——日志信息删除与修改(下)
  2. 2020 国内公司前端团队都在搞些什么?
  3. P200阿木无人机学习笔记--二维码引导着陆
  4. iOS - CodeReview 代码评审
  5. 交换机组播风暴_cisco交换机风暴控制
  6. apple 上传app store
  7. windows删除不了文件解决方法(亲测有效)
  8. 调整oracle服务器时间,oracle数据库因一次服务器时间调整引发的实例宕机注意事项及解决方案...
  9. 身体指数bmi流程图_BMI指数事关重大,你家娃合不合格赶紧来对表查!
  10. React:input输入框只能输入英文和特殊字符(可以自定义限制)