oracle bulk collect into,BULK COLLECT INTO
下面我们来看两个范例,一个是使用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相关推荐
- Oracle 中使用 fetch bulk collect into 批量效率的读取
http://www.jzxue.com/shujuku/oracle/201109/21-8976.html 通常我们获取游标数据是用 fetch some_cursor into var1, va ...
- Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据
通常我们获取游标数据是用 fetch some_cursor into var1, var2 的形式,当游标中的记录数不多时不打紧.然而自 Oracle 8i 起,Oracle 为我们提供了 fetc ...
- bulk插入 es_elasticsearch的helpers.bulk和es_client.bulk的用法
from elasticsearch import Elasticsearch import datetime es_client = Elasticsearch(["127.0.0.1:9 ...
- bulk插入 es_ElasticSearch的Bulk操作 ES bulk详解
elasticsearch bulkApi是什么?和普通的CURD区别在哪里? 1.可以批量对多个索引进行增加或者删除等操作,减少网络请求次数,可以显著的提高索引的速度. 2.CURD只能对单条数据进 ...
- es bulk java_Java Elasticsearch Bulk API 批量操作
ES的Bulk API主要用于在单个请求中,批量执行创建.更新.删除文档操作,避免循环发送大量的ES请求. 创建BulkRequest对象 BulkRequest request = new Bulk ...
- oracle bulk collect
碰到的问题,有一个员工表,存储着员工的各种信息. 我要写一个过程,传进去员工的名字,打印该员工的信息. create or replace procedure getInfo(name emp.ena ...
- PostgreSQL Oracle 兼容性之 - PL/SQL FORALL, BULK COLLECT
Oracle PL/SQL 开发的童鞋,一定对O家的bulk批量处理的性能很是赞赏吧. 但是PostgreSQL用户请不要垂涎,作为学院派和工业界的一颗璀璨明珠. 开源数据库PostgreSQL,也有 ...
- bulk怎么使用oracle,oracle学习之bulk collect用法
通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率 Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使 ...
- PL/SQL批处理语句:BULK COLLECT 和 FORALL
PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理,这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换,每次却换时,都有额外的开销 请看下图 ...
最新文章
- /* * 编程题第四题(20分): 	用1元5角钱人名币兑换5分、2分和1分的硬币(每一种都要有)共一百枚,问共有几种兑换方案?并输出每种方案。 */
- MyBatis DAO层开发——Mapper动态代理方式
- 给爸妈最硬核的春节礼物,走入百度大字版APP研发幕后
- 测试Live Writer
- C++多线程快速入门(一):基本常用操作
- 混合云模式助力斗鱼搭建混搭大数据架构
- Centos7 安装Go环境
- 1,日志组件XLog
- 计算机分级无法度量视频,雨林木风win7旗舰版电脑评分时出现无法度量视频播放性能...
- Android和iOS智能机去年出货超7亿 同比增长46%
- logrotate日志管理工具
- Java接受带文件的表单,Javaweb使用getPart来接收表单文件
- C语言如何求球的体积和表面
- 【教程】批量删除B站抽奖动态
- win策略计算机配置,BGinfo配置策略(Server2012R2-Win10)
- EOS智能合约开发系列(四)
- 计算机网络三级考试题型,计算机三级网络技术考试题型分析
- Linux Centos7 搭建简易堡垒机安装jailkit实现chroot
- 聊聊 Kafka:协调者 GroupCoordinator 源码剖析之 FIND_COORDINATOR
- 实习时候的亚子==(四)
热门文章
- Diary(八)——日志信息删除与修改(下)
- 2020 国内公司前端团队都在搞些什么?
- P200阿木无人机学习笔记--二维码引导着陆
- iOS - CodeReview 代码评审
- 交换机组播风暴_cisco交换机风暴控制
- apple 上传app store
- windows删除不了文件解决方法(亲测有效)
- 调整oracle服务器时间,oracle数据库因一次服务器时间调整引发的实例宕机注意事项及解决方案...
- 身体指数bmi流程图_BMI指数事关重大,你家娃合不合格赶紧来对表查!
- React:input输入框只能输入英文和特殊字符(可以自定义限制)