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关于事务.管道和分布式 ...
随机推荐
- 11月15日下午 ajax返回数据类型为XML数据的处理
ajax返回数据类型为XML数据的处理 /*XML:可扩展标记语言 HTML:超文本标记语言 标签:<标签名></标签名> 特点: 1.必须要有一个根 2.标签名自定义 3.对 ...
- Google Map API V3开发(1)
Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...
- Google Map API V3开发(5)
Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...
- C# 的tcp Socket设置自定义超时时间
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- golang笔记——string
任何语言中,字符串操作API都是非常重要的,有些还是熟记比较好,当然如果记不住可以去看源码文件,不得不说GO语言源码看起来非常舒服. 可以使用反引号代替双引号,来表示原生的字符串,即不进行转义,尤其适 ...
- ubuntu下mysql使用方法
连接mysql的命令为: mysql -u root(用户名) -p 使用 mysqladmin 命令行 修改 用户名密码的方式.最正确的格式如下: mysqladmin -u root -p pas ...
- 详细解读Android中的搜索框—— SearchView
以前总是自己写的 今天看看别人做的 本篇讲的是如何用searchView实现搜索框,其实原理和之前的没啥差别,也算是个复习吧. 一.Manifest.xml 这里我用一个activity进行信息的输入 ...
- [BZOJ2761][JLOI2011]不重复数字
[BZOJ2761][JLOI2011]不重复数字 试题描述 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复 ...
- (转)Intent flag 与启动模式的对应关系
原文地址:http://www.cnblogs.com/ttylinux/p/4069513.html Activity有四种启动模式: 1.standard(标准) 2.singleTop ...
- 用python修改haproxy配置文件
需求: 当用户输入域名的时候,显示出来下面的记录 当用户需要输入添加纪录的时候,添加到你需要的那个域名下面 global log 127.0.0.1 local2 daemon maxconn 256 ...