`

PL/SQL中用到的几种不同类型的游标写法(转)

 
阅读更多

java调用存储过程简单例子:

http://www.blogjava.net/TrampEagle/archive/2005/12/13/23605.html

如何选择游标:

http://space.itpub.net/batch.viewlink.php?itemid=176913

 

PL/SQL里的游标可以分为显式和隐式两种,而隐式有分为select into隐式游标和for .. in 隐式游标两种。所以,我们可以认为,有3种游标用法:
A. 显式游标
B. select into隐式游标
C. for .. in 隐式游标

 A. 显式游标
普通显式游标,指的是通过定义获得游标,并通过open,fetch,close的等方法来操作
游标[php]
declare
cursor c is select tname from tab ;
l_tname varchar2(64);
begin
open c ;
loop
        fetch c into l_tname ;
        exit when c%notfound ;
        dbms_output.put_line(l_tname);
end loop;
close c;
end;
/
..
..
[/php]


Bulk Collect的 显式游标

[php]
declare
cursor c is select tname from tab ;
l_tname_array dbms_sql.varchar2_table;
begin
open c ;
fetch c bulk collect into l_tname_array ;
for i in 1 .. l_tname_array.count loop
        dbms_output.put_line(l_tname_array(i) );
end loop;
close c;
end;
/


..
..
[/php]

Bulk Collect的 显式游标 + limit

[php]
declare
cursor c is select tname from tab ;
l_tname_array dbms_sql.varchar2_table;
begin
open c ;
loop
fetch c bulk collect into  l_tname_array limit 10 ;
exit when c%notfound ;
        for i in 1 .. l_tname_array.count loop
                dbms_output.put_line(l_tname_array(i) );
        end loop;
end loop;
close c;
end;
/


..
..
[/php]

 

 

隐式游标相对于显式游标而言,指的是不需要事先Declare,也无须用open,fetch,close的等方法来操作,而是通过其它的方式来操作游标


B. select into隐式游标

[php]
declare
l_tname varchar2(100);
begin
select tname into l_tname from tab where rownum = 1 ;
dbms_output.put_line(l_tname);
end;
/

..
..

[/php]

动态SQL 的 select into隐式游标
[php]
declare
l_tname varchar2(100);
l_table_name varchar2(100);
l_sql varchar2(200);
begin
l_table_name := 'TAB' ;
l_sql := 'select tname from '||l_table_name ||' where rownum = 1 ' ;
execute immediate l_sql into l_tname;
    dbms_output.put_line(l_tname );
end;
/

..
..

[/php]


动态SQL 的 select into隐式游标 + Bulk Collect
[php]
declare
l_tname_array dbms_sql.varchar2_table;
l_table_name varchar2(100);
l_sql varchar2(200);
begin
l_table_name := 'TAB' ;
l_sql := 'select tname from '||l_table_name ;
execute immediate l_sql bulk collect into l_tname_array;
for i in 1 .. l_tname_array.count loop
        dbms_output.put_line(l_tname_array(i) );
end loop;
end;
/

..
..

[/php]

 

 

C. for .. in 隐式游标
for .. in 隐式游标通过loop的开始于结束来控制cursor的Open与Close.

[php]
begin
for c in (select tname from tab) loop
dbms_output.put_line(c.tname);
end loop;
end;
/
..
..
[/php]

 

 2.三种用法的优劣
A. 显式游标
优点:
·可以用于Bulk Collect的批量处理句式以提高性能
·可以用于动态SQL的游标处理
缺点:
·麻烦,需要定义,打开,Fetch,Close一堆代码,增加代码复杂度,从而增加出错的可能性

B. select into隐式游标B
优点
·代码量最少
·可以自动Detect 返回数据超过一行或少于一行的错误
·可以使用Bulk Collect 批量处理,但是无法使用Limit 关键字
缺点
·如果不使用Bulk Collect 批量处理,仅仅只能用于返回数据正好一行的情况,无法使用于返回数据超过一行或少于一行的环境
·使用Bulk Collect 批量处理时,无法使用limit 关键字,无法处理返回行数太多的情况(不好处理,容易造成PGA过大)

C. for .. in 隐式游标
优点
·代码量远少于显式游标
·代码可读性优于显式游标
·代码的出错可能性也小于显式游标
缺点:
·无法用于动态SQL的游标处理
·在返回行数超过10行的情况下,性能明显不如使用Bulk Collect的显式游标

在性能对比方面,除非是使用了Bulk Collect,否则,三种方式没有明显性能差距。

 

3。具体的选择
·在返回数据为一行的情况下,尽量使用select into 的隐式游标

·返回0行或者<几十行的情况下,使用for .. in 隐式游标

·或者在返回行稍多,但是不关心Fetch性能的情况下,也可考虑用for .. in 隐式游标

·返回10行-100行(一个很随意选择的经验值,可以自己根据情况设定),而且关心Fetch性能的情况下,可以使用select into 的隐式游标+Bulk collect ,在获得性能提升的情况下,代码量也不会增加太多。

·返回行数很多,> 100, 应选用显示游标+Bulk collect ,以获得较高的Fetch 性能,同时不至于使用太大的PGA内存。

·如国使用动态SQL, 则根据select list (column list) 是否固定,如果固定,仍然可以考虑使用select into 的隐式游标+动态SQL的方式。当然,仍然需要考虑返回行数的问题。

·如果select list (column list) 不固定,则只好使用显式游标

·或者动态语句返回行数太多,必须用limit,那么也只好用显式游标了

 

 

 

分享到:
评论

相关推荐

    ORACLE PL/SQL从入门到精通

    PL/SQL提供了隐式游标和显示游标的两种类型,分别用于处理SELECT语句的返回结果。使用游标的FOR循环可以简化对游标的操作。 循环语句是PL/SQL编程中用来重复执行一组语句的结构,包括loop、while、for三种形式,...

    pl/sql最新中文手册

    1. **PL/SQL基础**:手册可能会从基础开始,介绍PL/SQL的基本结构,包括声明变量、常量、游标、记录类型等。还会讲解如何编写存储过程、函数和触发器。 2. **控制流程语句**:这包括条件判断(IF-THEN-ELSIF-ELSE)...

    一个对数据库的操作工具PL/SQLpl/sqL工具

    PL/SQL是Oracle公司开发的一种过程化语言,全称为Procedural Language/Structured Query Language,它是SQL的一个扩展,专门用于处理Oracle数据库系统。这个“PL/SQL工具”显然是一个用于辅助管理和操作Oracle数据库...

    oracle10g_pl/sql

    Oracle 10g PL/SQL 是Oracle数据库系统中用于创建和管理存储过程、函数、触发器等数据库对象的编程语言。本教程旨在为初学者提供一个全面的学习平台,同时也为经验丰富的开发者提供参考资料。PL/SQL是Oracle特有的...

    PL/SQL入门到精通书的源代码

    12. **游标变量**:游标变量是PL/SQL中的一种特殊变量,可以直接存储查询结果,用于在程序中传递查询结果。 13. **PL/SQL与Oracle数据库对象**:学习如何在PL/SQL中创建、修改和删除数据库对象,如表、视图、索引等...

    oracle pl/sql从入门到精通 配套源代码

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作功能与PL/SQL的程序设计特性,广泛应用于Oracle数据库的开发和管理。这本书"Oracle PL/SQL从入门到精通"的配套源代码,显然是为了...

    Oracle PL/SQL实战(待续)

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...

    Oracle资料学习PL/SQL必备

    2. **数据类型**:PL/SQL支持多种数据类型,包括数值类型(如NUMBER)、字符串类型(如VARCHAR2、CHAR)、日期时间类型(如DATE)、布尔类型(BOOLEAN)以及复合数据类型(如记录和数组)。 3. **变量声明和赋值**...

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **环境搭建与配置**:本书将介绍如何在不同的操作系统环境下安装并配置Oracle 11g数据库环境,以及如何设置PL/SQL Developer或其他开发工具来编写和测试PL/SQL代码。 - **基本语法与结构**:包括数据类型、变量...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    Oracle PL/SQL是一种强大的编程语言,它将数据库管理和应用程序逻辑紧密结合起来,是Oracle数据库系统中的核心组件之一。这本书“Oracle PL/SQL实例编程”显然旨在深入讲解如何利用PL/SQL进行实际开发工作,通过实例...

    PL/SQL 基本知识

    首先,PL/SQL是一种过程化语言,它允许用户定义变量、控制流程(如循环、条件语句)、处理异常,并且可以嵌入SQL查询,进行数据的增删改查操作。通过使用PL/SQL,数据库管理员和开发者可以更高效地管理和维护数据库...

    PL/SQL编程基础知识

    根据其特性和用途的不同,PL/SQL块可以分为以下几类: - **无名块或匿名块**:临时构建,只能执行一次,可以调用其他程序但不能被其他程序调用。 - **命名块**:带有一个特定的名字,可以被其他程序调用。 - **子...

    PL/SQL安装包

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL与过程编程的语言,用于在Oracle环境中开发数据库应用程序。PL代表Procedural Language,SQL则代表Structured Query Language。这个"PL/SQL安装包...

    Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

    本章节主要介绍了 PL/SQL 程序设计的基础知识,包括 PL/SQL 的优点、运行 PL/SQL 程序、PL/SQL 块结构、PL/SQL 基本语法、PL/SQL 处理流程、异常处理、游标、存储过程和函数、触发器等。 PL/SQL 的优点包括: * ...

    PL/SQL下载

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL语言与过程编程的语言,专为数据库管理和应用程序开发设计。PL/SQL全称为“Procedural Language/Structured Query Language”,它提供了丰富的控制...

    整理:oracle pl/sql 入门+ 数组使用+游标+动态SQL

    - PL/SQL数组:在PL/SQL中,数组是一种可以存储同一类型数据的集合,提供了批量操作数据的能力。 - 定义数组:学习如何声明并初始化数组,以及指定数组的大小和元素类型。 - 数组操作:包括赋值、索引访问、遍历...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    《Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发》是一本深入探讨Oracle数据库中的PL/SQL编程的专业书籍。PL/SQL是Oracle数据库特有的编程语言,它结合了SQL的查询能力与过程式编程语言的功能,使得数据库...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    3. **游标**:在PL/SQL中如何使用游标处理单行或多行数据,以及游标的声明、打开、关闭和循环遍历。 4. **记录类型**:定义和操作记录类型,用于处理动态或不确定的数据结构。 5. **集合类型**:包括数组(PLS_...

    pl/sql 学习资料

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL语言与过程式编程的高级语言,主要用于数据库管理和应用程序开发。在这个“PL/SQL学习资料”压缩包中,包含了十一个PDF文件,覆盖了从基础到进阶的...

Global site tag (gtag.js) - Google Analytics