事先申明,本文所有示例都皆源于《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. 广播接收者Receiver

    一,动态创建网络状态监控 思路: 1:需要注册一个广播接收者,registerReceiver()需要两个参数 public Intent registerReceiver( BroadcastRec ...

  2. Nginx下wordpress伪静态规则(rewrite)

    当我们从apache服务器转向Nginx服务器的时候,它们的伪静态规则就不一样了,所以你熟悉Nginx服务器的伪静态规则,自己写当然也好.但很多网友还是不太了解Nginx服务器的伪静态规则的,而如果你 ...

  3. [NHibernate]O/R Mapping基础

    系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) 引言 对象和关系数据库 ...

  4. js中join和split的用法

  5. jvm七种垃圾收集器

    JVM_七种垃圾收集器介绍   本文中的垃圾收集器研究背景为:HotSpot+JDK7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老 ...

  6. Node.js入门学习笔记(一)

    先来个最常见的"Hello World!". 打开你最喜欢的编辑器(我用的是Sublime Text),创建一个helloWorld.js的文件.我们要做的就是向stdout输出& ...

  7. jquery和dom之间的转换

    刚开始学习jquery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象.至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换. 什么是jQuery对 ...

  8. 01OC概述

    目前来说,Objective-C(简称OC)是iOS开发的核心语言,在开发过程中也会配合着使用C语言.C++,OC主要负责UI界面,C语言.C++可用于图形处理.特点如下: 一.OC基于C语言 C语言 ...

  9. Android--UI之Spinner

    前言 最近一直在讲AndroidUI的开发,今天讲一下Spinner控件,这是一个列表选择框,可以弹出一个列表供用户选择.在本片博客中,会讲解Spinner的基本属性以及设置之后的效果,以及使用Sim ...

  10. [BZOJ2391]Cirno的忧郁

    [BZOJ2391]Cirno的忧郁 试题描述 Cirno闲着无事的时候喜欢冰冻青蛙. Cirno每次从雾之湖中固定的n个结点中选出一些点构成一个简单多边形,Cirno运用自己的能力能将此多边形内所有 ...