事先申明,本文所有示例都皆源于《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 调用方式集锦的更多相关文章

  1. 【转】java通用URL接口地址调用方式GET和POST方式

    java通用URL接口地址调用方式GET和POST方式,包括建立请求和设置请求头部信息等等......... import java.io.ByteArrayOutputStream; import ...

  2. java 实现WebService 以及不同的调用方式

    webservice:    就是应用程序之间跨语言的调用    wwww.webxml.com.cn    1.xml    2.    wsdl: webservice description l ...

  3. Wcf:可配置的服务调用方式

    添加wcf服务引用时,vs.net本来就会帮我们在app.config/web.config里生成各种配置,这没啥好研究的,但本文谈到的配置并不是这个.先看下面的图: 通常,如果采用.NET的WCF技 ...

  4. Winform开发框架的业务对象统一调用方式

    在这个纷繁的社会里面,统一性的特点能够带来很多高效的产出.牢固的记忆,这种特征无论对于企业.个人的开发工作,知识的传承都有着非常重要的作用,Winfrom框架本身就是基于这个理念而生,从统一的数据库设 ...

  5. WM_QUIT,WM_CLOSE,WM_DESTROY 消息出现顺序及调用方式

    http://bbs.ednchina.com/BLOG_ARTICLE_3005455.HTM VC中WM_CLOSE.WM_DESTROY.WM_QUIT消息出现顺序及调用方式 wxleasyla ...

  6. Webservice 调用方式整理

    前一段时间搞webservice,简单的记录了一下几种常用的调用方式,供大家参考. 第一种:Java proxy 1).用过eclipse的创建web service client来完成 2).在ec ...

  7. magento 列表页显示产品属性值的几种调用方式

    之前有人提到要在列表显示一些特定的属性,除了自带的名字,价格等.因为列表页和产品页都有一个同名的产品对象:$_product,而在产品页,$_product是直接可以用$_product->ge ...

  8. OAuth在WebApi中的使用,前后台分离的调用方式

    前段时间由于公司架构服务层向WebApi转换,就研究了OAuth在WebApi中的使用,这中间遇到了很多坑,在此记录一下OAuth的正确使用方式. 1.  OAuth是做什么的? 在网上浏览时,大家都 ...

  9. Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

    jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...

随机推荐

  1. 第二轮冲刺-Runner站立会议09

    今天:将日历界面和主程序结合起来 明天:查看整个项目,调试是否有问题

  2. JAVA起名规范

    1:包名 package com.cenzhongman.模块名.组件 必须全部小写,作为java文件第一行代码 2:类名 名词,表示一类实物,如:人类 首字母大写 3.接口名 形容词/副词,表示一种 ...

  3. 汤森路透为何一定要卖掉SCI?

    http://health.sohu.com/20160714/n459331727.shtml

  4. c标签遍历List<Map<String, Object>> 数据格式

    <c:forEach varStatus="loop" var="dataMap" items="${dataMap}"> &l ...

  5. 解决在ScrollView中套用ListView显示不正常

    最近在设计Android程序时,因为需要在ScrollView中添加一个ListView列表来显示一些信息.刚开始并没有想太多,但添加进去后才发现ListView不论怎样定义都只能显示一行,显示效果很 ...

  6. vijos1250 最勇敢的机器人

    背景 Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ 描述 机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品. 它们到了一个仓库,里面有n个物品,每个物品都有一个价 ...

  7. CMake命令/函数汇总(翻译自官方手册)

    查看官方文档 cmake命令 选项 CMake变量 CMake命令汇总 / add_custom_command add_custom_target/add_definitions/add_depen ...

  8. 【Alpha版本】冲刺阶段——Day 2

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  9. Python正则表达式详解

    我用双手成就你的梦想 python正则表达式 ^ 匹配开始 $ 匹配行尾 . 匹配出换行符以外的任何单个字符,使用-m选项允许其匹配换行符也是如此 [...] 匹配括号内任何当个字符(也有或的意思) ...

  10. 正则表达式工具RegexBuddy使用教程

    1. 界面介绍  (1)初始界面选项介绍 (2)如何使用匹配 (3)如何使用正则替换 (4)如何使用Debug http://www.cnblogs.com/tsql/p/5860893.html