ORACLE PL/SQL开发--bulk collect的用法 .
刚刚在inthirties老大的博客里看到这篇文章,写的不错,正好自己最近在学习PL/SQL,转过来学习学习。
==================================================================================
bulk collect是可以看做是一种批获取的方式,在我们的plsql的代码段里经常作为into的扩展来使用。对于select id into v from .... 是一个常用的用法。不过这里只能是返回单条记录的时候,才能使用,如果是有多条记录我们就不能用这样的方式,而是使用fetch和循环的方式,不仅使用麻烦,而且性能也底下,这时我们的bulk collect隆重登场了,解决我们的问题。
通过bulk collect可以把我们的查询结果一次性地加载到我们的嵌入表中。这样我们不需要很麻烦的用游标的循环一条一条的去fetch叻,可想而知,这样不仅操作方便,也可以获得相当不错的程序性能。 我们可以在select into, fetch into, returning into的句子中使用。下面我们通过对以上各个例子来进行演示来看看他们的用法
先来看看我们的测试表和数据
SQL> desc test;
Name Null? Type
----------------------------------------- -------- ----------------------------
ZC_CODE VARCHAR2(20)
MONEY NUMBER(35)
MONEY_2 NUMBER(35)
SQL> col zc_code format a20;
SQL> col money format 999999.99;
SQL> col money_2 format 9999.99;
SQL>select * from test;
ZC_CODE MONEY MONEY_2
-------------------- ---------- --------
201 18600.00
20101 9600.00
2010101 3300.00
2010102 3200.00
2010103 3100.00
20102 9000.00
2010201 2000.00
2010202 7000.00
8 rows selected.
定义我们的嵌套表的类型, 定义在一个package里,这个package使我们的数据类型集合
SQL> create or replace package ALL_DATA_TYPE is
2 type T_TESTROW is table of test1.test%rowtype index by binary_integer;
3 type T_TESTZCCODE is table of test1.test.zc_code%type index by binary_integer;
4 end;
5 /
先来个select into的例子
SQL> create or replace function test_bulkcollect return ALL_DATA_TYPE.T_TESTROW is
2 v_rtn ALL_DATA_TYPE.T_TESTROW;
3 begin
4 select * bulk collect into v_rtn from test;
5 return v_rtn;
6 end;
7 /
统一的测试方法, 我们分别用这个测试代码来演示以上select into,fetch into和returning into的例子
SQL> declare
2 v_test ALL_DATA_TYPE.T_TESTROW;
3 begin
4 v_test := test_bulkcollect;
5 for i in 1..v_test.count loop
6 dbms_output.put_line(i||'='||v_test(i).zc_code||','||v_test(i).money||','||v_test(i).money_2);
7 end loop;
8 end;
9 /
1=201,18600,
2=20101,9600,
3=2010101,3300,
4=2010102,3200,
5=2010103,3100,
6=20102,9000,
7=2010201,2000,
8=2010202,7000,
用动态sql的bulk collect into来一个
SQL> create or replace function test_bulkcollect return ALL_DATA_TYPE.T_TESTROW is
2 v_rtn ALL_DATA_TYPE.T_TESTROW;
3 begin
4 execute immediate 'select * from test' bulk collect into v_rtn;
5 return v_rtn;
6 end;
测试结果
1=201,18600,
2=20101,9600,
3=2010101,3300,
4=2010102,3200,
5=2010103,3100,
6=20102,9000,
7=2010201,2000,
8=2010202,7000,
使用fetch的例子
SQL> create or replace function test_bulkcollect return ALL_DATA_TYPE.T_TESTROW is
2 v_rtn ALL_DATA_TYPE.T_TESTROW;
3 cursor c is select zc_code, money, nvl(money_2, 0) money_2 from test;
4 begin
5 open c;
6 fetch c bulk collect into v_rtn;
7 close c;
8 --execute immediate 'select * from test' bulk collect into v_rtn;
9 return v_rtn;
10 end;
11 /
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/inthirties/archive/2009/10/30/4748299.aspx
ORACLE PL/SQL开发--bulk collect的用法 .的更多相关文章
- Oracle学习笔记之五sp1,PL/SQL之BULK COLLECT
Bulk Collect特性可以让我们在PL/SQL中能使用批查询,批查询在某些情况下能显著提高查询效率. BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQ ...
- Oracle批量SQL之 BULK COLLECT 子句
BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎.通常可以在SELECT INTO.FETCH INTO以及RETURNING ...
- Oracle PL/SQL开发基础(第三十三弹:EXCEPTION_INIT)
如果有一些异常并没有异常名称,比如一些ORA-开头的异常并没有一个友好的预定义的异常定义,此时在WHEN子句中无法使用具体的异常名称,必须要使用OTHERS异常处理器进行捕捉.通过EXCEPTION_ ...
- Oracle PL/SQL开发基础(第三十四弹:RAISE_APPLICATION_ERROR)
RAISE_APPLICATION_ERROR在子程序内部使用时,能从存储子程序中抛出自定义的错误消息.这样就能将错误报告给应用程序而避免范围未捕获异常. 语法如下: RAISE_APPLICATIO ...
- 转://Oracle PL/SQL 优化与调整 -- Bulk 说明
一. Bulk 概述 本来只想测试一下Bulk Collect 和update性能的,但发现Bulk 的东西还是很多的,在OTN上搜了一些,整理如下. 1.1 Bulk Binding 和 Bulk ...
- Oracle+PL+SQL从入门到精通.丁士锋.清华大学出版社.2012
\t第1篇 pl/sql开发入门第1章 oracle 11g数据库系统1.1 关系型数据库系统介绍1.1.1 什么是关系型数据模型1.1.2 数据库系统范式1.1.3 关系型数据库管理系统1.1.4 ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- Oracle PL/SQL Articles
我是搬运工....http://www.oracle-base.com/articles/plsql/articles-plsql.php Oracle 8i Oracle 9i Oracle 10g ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
随机推荐
- [转载]OpenSUSE 13.2/13.1 安装搜狗拼音输入法
1. 添加 M17N 源: 13.2: sudo zypper ar -f http://download.opensuse.org/repositories/M17N/openSUSE_13.2/ ...
- LinearLayout的一些注意事项
1.orientation的默认值为horizontal,即从左向右排列.由于一般从上向下排列,所以必须指定orientation属性. 2.layout_gravity与gravity的区别: (1 ...
- export-data.js
var timeBtnClick = (function() { function _todayClick() { $('.select-time .today').on('click', funct ...
- 在Raspberry上使用小度WIFI
小度WIFI价格便宜量又足,我一真用它!做个广告先! 它使用联发科MT7601的芯片,质量不错,就是Raspberry下不能直接支持. 首先下载驱动 http://www.mediatek.com/_ ...
- Gnome快捷键
1.Gnome快捷键 http://wiki.ubuntu.org.cn/Gnome%E5%BF%AB%E6%8D%B7%E9%94%AE 2.
- poj 1129 Channel Allocation
http://poj.org/problem?id=1129 import java.util.*; import java.math.*; public class Main { public st ...
- USBASP下载线制作教程
- Keil C51 Data Overlaying
一般的编译器将函数中的区域变数动态配置在stack,等函数结束空间就释放出来.因为8051 的内部记忆体很少,只有区区128 或256 bytes,而且stack 也是共用这块记忆体.为了节省stac ...
- android面试题集1
Android 面试题(有详细答案) 附带答案,共100分 一.选择题(30题,每题1.5分,共45分) 1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分类,按功 ...
- iOS 无效的版本,提交成功,不出现版本号
最近更新到 iOS 10,提交审核 会卡在 转菊花 ...需要更新到Xcode 8 去提交. 然后提交成功后,版本管理 新版本,构建版本 迟迟不出来.恭喜你,你的版本是无效的.请看看 你的 公司app ...