Bulk_Collect 调用方式集锦
事先申明,本文所有示例都皆源于《Expert PL SQL Practices》这本电子书的第六章。小陈觉得在学习PLSQL的过程中,将来或许会用到,在此笔记一番。
正文如下:
首先准备基础数据吧 HARDWARE 表。
表结构如图所示:

然后插入1,000,000条数据吧。这里不得不说,PLSQL里面,dual表的确帮助很大,当然T-SQL里面你也可以建一张辅助表的。这里用的Oracle SQL Developer自带的格式化功能,相当弱。
INSERT INTO HARDWARE SELECT TRUNC(rownum/1000)+1 aisle, rownum item, 'Description ' ||rownum descr FROM ( SELECT 1 FROM dual CONNECT BY level <= 1000 ), ( SELECT 1 FROM dual CONNECT BY level <= 1000 );
这里先说最古老的用法吧:
SET serveroutput ON;
cl scr;
DECLARE
l_cursor INT := dbms_sql.open_cursor;
l_num_row dbms_sql.number_table;
l_exec INT;
l_fetched_rows INT;
BEGIN
dbms_sql.parse( l_cursor, 'select item from hardware where item <= 1200', dbms_sql.native);
dbms_sql.define_array(l_cursor,1,l_num_row,500,1);
l_exec := dbms_sql.execute(l_cursor);
LOOP
l_fetched_rows := dbms_sql.fetch_rows(l_cursor);
dbms_sql.column_value(l_cursor, 1, l_num_row);
dbms_output.put_line('Fetched '||l_fetched_rows||' rows');
EXIT
WHEN l_fetched_rows < 500;
END LOOP;
dbms_sql.close_cursor(l_cursor);
END;
上面的调用极不推荐,进入主题吧。
1. Implicit Cursor
DECLARE
l_descr hardware.descr%type;
BEGIN
SELECT descr
INTO l_descr
FROM hardware
WHERE aisle = 1
AND item = 1;
END;
2. Explicit Fetch Calls
DECLARE
CURSOR c_tool_list
IS
SELECT descr FROM hardware WHERE aisle = 1 AND item BETWEEN 1 AND 500;
l_descr hardware.descr%type;
BEGIN
OPEN c_tool_list;
LOOP
FETCH c_tool_list INTO l_descr;
EXIT
WHEN c_tool_list%notfound;
END LOOP;
CLOSE c_tool_list;
END;
3. Implicit Fetch Calls
BEGIN
FOR i IN
( SELECT descr FROM hardware WHERE aisle = 1 AND item BETWEEN 1 AND 500
)
LOOP
pl(i.descr);--<processing code FOR EACH row>
END LOOP;
END;
BEGIN
FOR i IN
( SELECT descr FROM hardware WHERE aisle = 1 AND item BETWEEN 1 AND 500
)
LOOP
--<processing code for each row>
END LOOP;
END;
4. Implicit Cursor BULK Mode
DECLARE type t_descr_list IS TABLE OF hardware.descr%type; l_descr_list t_descr_list; BEGIN SELECT descr bulk collect INTO l_descr_list FROM hardware WHERE aisle = 1 AND item BETWEEN 1 AND 100; END;
5. Explicit Fetch Calls BULK Mode
DECLARE
CURSOR c_tool_list
IS
SELECT descr FROM hardware WHERE aisle = 1 AND item BETWEEN 1 AND 500;
type t_descr_list
IS
TABLE OF c_tool_list%rowtype;
l_descr_list t_descr_list;
BEGIN
OPEN c_tool_list;
FETCH c_tool_list bulk collect INTO l_descr_list;
CLOSE c_tool_list;
END;
最后给点彩蛋吧,还是书中的内容。比如T-SQL处理XML,ORACLE不知道甩了它几条街呢。
CREATE OR REPLACE type COMING_FROM_XML
AS
object
(
COL1 INT,
COL2 INT)
DECLARE
source_xml xmltype;
target_obj coming_from_xml;
BEGIN
source_xml := xmltype('<DEMO>
<COL1>10</COL1>
<COL2>20</COL2>
</DEMO>');
source_xml.toObject(target_obj);
dbms_output.put_line( target_obj.COL1 || ',' || target_obj.COL2);
END;
DECLARE
l_refcursor SYS_REFCURSOR;
l_xmltype XMLTYPE;
BEGIN
OPEN l_refcursor FOR SELECT aisle , item,descr FROM HARDWARE WHERE aisle = 1 AND item BETWEEN 1 AND 10;
l_xmltype := XMLTYPE(l_refcursor);
dbms_output.put_line(l_xmltype.getClobVal);
END; DECLARE
l_xmltype XMLTYPE;
BEGIN
l_xmltype := dbms_xmlgen.getxmltype('SELECT aisle , item,descr FROM HARDWARE WHERE aisle = 1 AND item BETWEEN 1 AND 10' );
dbms_output.put_line(l_xmltype.getClobVal);
END; DECLARE
l_xmltype XMLTYPE;
l_ctx dbms_xmlgen.ctxhandle;
BEGIN
l_ctx := dbms_xmlgen.newcontext('SELECT aisle , item,descr FROM HARDWARE WHERE aisle = 1 AND item BETWEEN 1 AND 10'
); dbms_xmlgen.setrowsettag(l_ctx, 'HARDWARE');
dbms_xmlgen.setrowtag(l_ctx, 'Store'); l_xmltype := dbms_xmlgen.getXmlType(l_ctx) ;
dbms_xmlgen.closeContext(l_ctx); dbms_output.put_line(l_xmltype.getClobVal);
End;
结语:小陈学习ORCALE时间不久,有的都是T-SQL功底。只从简洁上来说,还是觉得T-SQL好多了。如果以慈母严父来形容MS与ORACLE。那么前者绝对好妈妈,后者是坏爸爸。
Bulk_Collect 调用方式集锦的更多相关文章
- 【转】java通用URL接口地址调用方式GET和POST方式
java通用URL接口地址调用方式GET和POST方式,包括建立请求和设置请求头部信息等等......... import java.io.ByteArrayOutputStream; import ...
- java 实现WebService 以及不同的调用方式
webservice: 就是应用程序之间跨语言的调用 wwww.webxml.com.cn 1.xml 2. wsdl: webservice description l ...
- Wcf:可配置的服务调用方式
添加wcf服务引用时,vs.net本来就会帮我们在app.config/web.config里生成各种配置,这没啥好研究的,但本文谈到的配置并不是这个.先看下面的图: 通常,如果采用.NET的WCF技 ...
- Winform开发框架的业务对象统一调用方式
在这个纷繁的社会里面,统一性的特点能够带来很多高效的产出.牢固的记忆,这种特征无论对于企业.个人的开发工作,知识的传承都有着非常重要的作用,Winfrom框架本身就是基于这个理念而生,从统一的数据库设 ...
- WM_QUIT,WM_CLOSE,WM_DESTROY 消息出现顺序及调用方式
http://bbs.ednchina.com/BLOG_ARTICLE_3005455.HTM VC中WM_CLOSE.WM_DESTROY.WM_QUIT消息出现顺序及调用方式 wxleasyla ...
- Webservice 调用方式整理
前一段时间搞webservice,简单的记录了一下几种常用的调用方式,供大家参考. 第一种:Java proxy 1).用过eclipse的创建web service client来完成 2).在ec ...
- magento 列表页显示产品属性值的几种调用方式
之前有人提到要在列表显示一些特定的属性,除了自带的名字,价格等.因为列表页和产品页都有一个同名的产品对象:$_product,而在产品页,$_product是直接可以用$_product->ge ...
- OAuth在WebApi中的使用,前后台分离的调用方式
前段时间由于公司架构服务层向WebApi转换,就研究了OAuth在WebApi中的使用,这中间遇到了很多坑,在此记录一下OAuth的正确使用方式. 1. OAuth是做什么的? 在网上浏览时,大家都 ...
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...
随机推荐
- sqlalchemy默认时间
我查到的sqlalchemy默认时间有2种: from sqlalchemy.sql import func time_created = Column(DateTime(timezone=True) ...
- Python学习笔记——集合类型
集合类型有两种不同的类型——可变集合(set)和不可变集合(frozenset) 可变集合不是可哈希的,不能用作字典的键,也不能用做其他集合中的元素 不可变集合是有哈希值的,能被用做字典的键或者是作为 ...
- Fedora 23安装 NS2 (network simulator 2)
1 实验环境 OS: Fedora 23 workstation 2 实验步骤 ( 参考了:http://www.isi.edu/nsnam/ns/ns-build.html) 本次实验的实验环境: ...
- 22章、Java集合框架习题
1.描述Java集合框架.列出接口.便利抽象类和具体类. Java集合框架支持2种容器:(1) 集合(Collection),存储元素集合 (2)图(Map),存储键值对.
- javascript操作referer
Referrer的重要性 HTTP请求中有一个referer的报文头,用来指明当前流量的来源参考页.例如在www.sina.com.cn/sports/上点击一个链接到达cctv.com首页,那么就r ...
- 使用行为树(Behavior Tree)实现游戏AI
——————————————————————— 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策 ...
- Angular-Chart.js 初接触;;;
可以先看下下面的链接,了解下, 推荐链接 准备工作 JS文件{angular.js.Chart.js.angular-chart.js} 这3个文件我的获取难易程度:Chart.js > ang ...
- PHP面向对象(OOP)编程入门教程
面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...
- AJAX工作原理及其优缺点
1.什么是AJAX?AJAX全称为"Asynchronous JavaScript and XML"(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术.它 ...
- 使用github pages, hexo搭建个人博客教程
具体的原理性的东西就不说了直接上教程,怕等下自己忘了. 一. github 阶段 申请一个github 账号并成功登录进去. 创建一个名字为xxx.github.io的空项目. 二. hexo 阶段 ...