`

PL/SQL 中如何正确选择游标类型

阅读更多

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

A. 显式游标

B. select into隐式游标

C. for .. in 隐式游标

如何正确的选择使用哪种游标,将对你的程序的性能,可读性,代码量等产生重大影响……

--By RollingPig,

本文简单的列举了PL/SQL中用到的几种不同类型的游标写法,并简单对比了不同游标写法的优缺点,同时给出了一个选择的基本原则。

本文并不包括太多的实际运行/性能测试,有兴趣的话,大家可以根据示例自己测试。

1.三种游标形式的简单例子

A. 显式游标

普通显式游标,指的是通过定义获得游标,并通过open,fetch,close的等方法来操作游标

代码:

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;

/

..

..

Bulk Collect的 显式游标

代码:

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;

/

..

..

Bulk Collect的 显式游标 + limit

代码:

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;

/

..

..

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

B. select into隐式游标

代码:

declare

l_tname varchar2(100);

begin

select tname into l_tname from tab where rownum = 1 ;

dbms_output.put_line(l_tname);

end;

/

..

..

动态SQL 的 select into隐式游标

代码:

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;

for i in 1 .. l_tname_array.count loop

dbms_output.put_line(l_tname_array(i) );

end loop;

end;

/

..

..

动态SQL 的 select into隐式游标 + Bulk Collect

代码:

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;

/

..

..

C. for .. in 隐式游标

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

代码:

begin

for c in (select tname from tab) loop

dbms_output.put_line(c.tname);

end loop;

end;

/

..

..

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行或者 100, 应选用显示游标+Bulk collect ,以获得较高的Fetch 性能,同时不至于使用太大的PGA内存。

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

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

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

分享到:
评论

相关推荐

    pl/sql最新中文手册

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

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

    3. **游标**:PL/SQL支持游标,允许用户逐行处理查询结果,这对于处理大量数据时非常有用。 4. **事务管理**:PL/SQL提供BEGIN、COMMIT、ROLLBACK等语句来管理事务,确保数据的一致性和完整性。 5. **异常处理**:...

    oracle10g_pl/sql

    - **游标变量**:用于存储游标状态,可以在PL/SQL中传递和操作。 - **包**:将相关的过程、函数和变量打包在一起,便于管理和重用。 6. **PL/SQL性能优化** - **绑定变量**:减少解析次数,提高执行效率。 - **...

    Oracle PL/SQL实战(待续)

    同时,PL/SQL支持多种数据类型,包括数值类型(NUMBER)、字符类型(VARCHAR2, CHAR)、日期类型(DATE)等,以及复合类型如记录(RECORD)和表类型(TABLE)。 此外,PL/SQL的包(PACKAGE)概念是将相关的过程和...

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

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

    ORACLE PL/SQL从入门到精通

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

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

    总结起来,PL/SQL中的游标类型主要包括隐式游标、显式游标、匿名块游标、游标变量和FOR-LOOP游标。每种游标类型都有其特定的应用场景,熟练掌握这些游标用法将有助于编写更加高效和灵活的数据库应用程序。

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

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

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

    - **集合与记录**:学习如何使用PL/SQL中的集合和记录类型,这些结构可以帮助更高效地处理数据集。 - **游标**:介绍游标的使用方法,包括隐式游标和显式游标,以及如何利用游标遍历查询结果。 #### 四、PL/SQL中的...

    pl/sql 学习资料

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

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

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

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

    Oracle PL/SQL是一种...书中可能包含各种类型的PL/SQL程序设计技巧,从简单的存储过程和函数到复杂的事务处理和并发控制策略。通过实例学习,你将能够更好地理解和运用这些概念,提升你在Oracle数据库开发中的技能。

    PL/SQL编程基础知识

    需要注意的是,在PL/SQL中只能使用SQL的DML(Data Manipulation Language)部分,而不能直接使用DDL(Data Definition Language)部分,如创建表(CREATE TABLE)等操作。如果需要在PL/SQL中执行DDL操作,则需要通过...

    PL/SQL安装包

    6. **游标**:PL/SQL中的游标允许逐行处理查询结果,是处理复杂数据操作的重要工具。 7. **记录类型和变量**:PL/SQL支持自定义记录类型和变量,使得可以创建更贴近业务需求的数据结构。 这个"PL/SQL安装包"可能...

    PL/SQL 基本知识

    PL/SQL是Oracle数据库系统中的一个核心组件,全称为“Procedural Language/Structured Query Language”,它是SQL的扩展,增加了编程元素,使得开发者能够编写存储过程、函数、触发器等数据库应用程序。这篇博客主要...

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

    在 PL/SQL 中,可以使用游标来处理查询结果,游标可以分为隐式游标和显式游标两种。隐式游标是 Oracle 自动生成的游标,而显式游标是用户定义的游标。 PL/SQL 处理流程包括过程、函数、触发器三种。过程是 PL/SQL ...

    PL/SQL中文帮助手册

    2. **变量和数据类型**:PL/SQL支持多种数据类型,如数值型(NUMBER)、字符串型(VARCHAR2、CHAR)、日期型(DATE)以及布尔型(BOOLEAN)。变量的声明和初始化是编写PL/SQL程序的基础。 3. **流程控制**:PL/SQL...

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

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

    PL/SQL下载

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

    Pl/Sql程序设计

    1、PL/SQL简介 2、PL/SQL基础 3、记录和表 4、在PL/SQL中使用SQL 5、内置SQL函数 6、游标 7、过程和函数 ...

Global site tag (gtag.js) - Google Analytics