`
isiqi
  • 浏览: 16549828 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

PLSQL基础(三)游标

阅读更多

游标有两种:

显示游标,隐式游标

显示游标是用CURSOR...IS命令定义的游标,它可以对查询语句(SELECT)返回的多条记录进行处理,而隐式游标是在执行插入(INSERT),删除(DELETE),修改(UPDATE)和返回单条记录的查询(SELECT)语句时由PLSQL自动定义的。

显示游标的操作

1)打开游标 2)推进游标 3)关闭游标

声明游标:

DECLARE

v_auths auths%ROWTYPE;

v_code auths.author_code%TYPE;

CURSOR c_auths IS

SELECT * FROM auths WHERE author_code = v_code;

打开游标:

v_code = 'A00001';

OPEN c_auths;

声明游标

DECLARE

CURSOR c_Auths(P_code auths.author_code%TYPE) IS

SELECT * FROM auths WHERE author_code = P_code;

打开游标

OPEN c_Auths('A00001');

当打开显示游标后,就可以使用FETCH语句来推进游标,返回查询结果中的一行。没执行完一条FETCH语句后,显示游标会自动指向查询结果集的下一行。

FETCH c_Auths INTO c_Auths;

当整个结果集都检索完以后,应当关闭游标,关闭游标用来通知PLSQL游标操作已经结束,并且释放游标所占用的资源.

CLOSE cursor_name;

游标的属性

游标有四个属性 %FOUND,%NOTFOUND,%ISOPEN,%ROWCOUNT

显式游标的推荐循环

DECLARE

v_Salary Auths.salary%TYPE;

v_Code Auths.author_code%TYPE;

CURSOR c_salary IS

SELECT salary,author_code FROM auths WHERE author_code <= 'A00006';

BEGIN

OPEN c_salary;

LOOP

FETCH c_salary INTO v_Salary,v_Code;

EXIT WHEN c_salary%NOTFOUNT;

IF v_salary <= 2000 THEN

UPDATE auths SET salary = salary + 50 WHERE author_code = v_Code;

END IF;

END LOOP;

CLOSE c_salary;

COMMIT;

END;

无论是使用LOOP...END LOOP语句还是使用WHILE...LOOP语句来完成游标的推进循环,都必须使用OPEN,FETCH,CLOSE语句来控制游标的打开,推进和关闭,PLSQL还提供了一种简单类型的循环,可以自动控制游标的打开,推进和关闭,这叫做游标的FOR循环.

DECLARE

CURSOR c_salary IS

SELECT salary FROM auths WHERE author_code <= 'A00006';

BEGIN

--开始游标FOR循环,隐含地打开c_salary游标

FOR v_salary IN c_calary LOOP

IF v_salary.salary <= 200 THEN

UPDATE auths SET salary = salary + 50 WHERE salary = v_salary.salary;

END IF;

END LOOP;

COMMIT;

END;

上例中v_salary没有在块的定义部分声明,该变量被PLSQL编译器隐含的声明了,该变量的类型为c_salary%ROWTYPE,其作用域只在循环内部。

隐式游标

显示游标仅仅是用来控制返回多行的SELECT语句,而隐式游标是指向处理所有的SQL语句的环境区域的指针,隐式游标也叫SQL游标,与显示游标不同的是,SQL游标不能通过专门的命令打开或关闭,PLSQL隐式的打开SQL游标,并在它内部处理SQL语句,然后关闭它。

SQL游标用来处理INSERT,UPDATE,DELETE以及返回一行的SELECT ...INTO语句。一个SQL游标不管是打开还是关闭,OPEN,FETCH,CLOSE命令都不能操作它。

SQL游标与显示游标类似,也有%FOUND,%NOTFOUND,%ISOPEN,%ROWTYPE属性,SQL游标的属性通常是返回执行INSERT,DELETE,UPDATE或SELECT...INTO语句时的信息,当打开SQL游标之前,SQL游标的属性都是NULL.

%FOUND

当使用INSERT,DELETE或者UPDATE语句处理一行或多行,或执行SELECT INTO语句返回一行时,%FOUND属性返回TRUE,否则返回FALSE.

注意:如果执行SELECT INTO语句时返回多行,则会产生TOO_MANEY_ROWS异常,并将控制权转移到异常处理部分,%FOUND属性并不返回TRUE.如果执行SELECT INTO语句时返回0行,会产生NO_DATE_FOUND异常,%FOUND属性并不返回FALSE.

%NOTFOUND

%NOTFOUND恰与%FOUND属性相反,当使用INSERT,DELETE或者UPDATE语句处理的函数为0时,%NOTFOUND属性返回TRUE,否则返回FALSE.

%ISOPEN

因为在执行了DML语句后,Oracle会自动关闭SQL游标,所以%ISOPEN总会FALSE.

%ROWCOUNT

该属性返回执行INSERT,DELETE或UPDATE语句返回的行数,或返回执行SELECT INTO语句时查询的行数,如果INSERT,DELETE,UPDATE或SELECT INTO语句返回的行数为0,则%ROWTYPE属性返回0.

BEGIN

UPDATE auths SET entry_date_time = SYSDATE WHERE author_code = 'A00007';

--如果UPDATE语句中修改的行不存在(SQL%NOTFOUND返回TURE)

IF SQL%NOTFOUND THEN

INSERT INTO auths values(......)......

END IF;

END;

我们使用SQL%ROWCOUNT完成与上例相同的功能。

BEGIN

UPDATE auths SET entry_date_time = SYSDATE WHERE author_code = 'A00007';

IF SQL%ROWCOUNT = 0 THEN

INSERT INTO ......

END IF;

END;

游标变量

到目前为止前面所有显示游标的例子都是静态游标----即游标与一个SQL语句关联,并且该SQL语句在编译时已经确定,而游标变量是一个引用类型(REF)的变量,当程序运行时使用游标变量可以指定不同的查询,所以游标变量的使用比静态游标更灵活。

我们可以使用一个没有指定结果集类型的游标变量来指定多个不同类型的查询.

DECLARE

--定义游标变量类型t_CurRef,该变量类型没有指定结果集类型,所以该游标变量类型的变量可以返回不同的PLSQL记录类型

TYPE t_CurRef IS REF COUSOR

--声明一个游标变量类型的变量

c_CursorRef t_CurRef;

--定义PLSQL记录类型

TPYE t_AuthorRec IS RECORD

(

AuthorCode auths.author_code%TYPE;

Name auths.name%TYPE

);

TYPE t_ArticleRec IS RECODE

(

AuthorCode article.author_code%TYPE

Title article.Title%TYPE

);

--声明两个记录类型变量

v_Author t_AuthorRec;

v_Ariticlet_ArticleRec;

BEGIN

--打开游标变量c_CursorRef,返回t_AuthorRec类型的记录

OPEN c_CursorRef FOR

SELECT author_code,name FROM auths;

FECTCH c_CursorRef INTO v_Author;

WHILE c_CursorRef%FOUND LOOP

...

FETCH c_CursorRef INTO v_Author;

END LOOP;

CLOSE c_CursorRef;

OPEN c_CursorRef FOR

SELECT author_code,title FROM ariticle

FETCH c_CursorRef INTO v_Article;

WHILE c_CursorRef%FOUND LOOP

...

FETCH c_CursorRef INTO v_Article;

END LOOP;

CLOSE c_CursorRef;

END;

注意,在上例中,第一次关闭游标变量是可以省略的,因为在第二次打开游标变量是,就将第一次的查询丢失掉了.

分享到:
评论

相关推荐

    plsql基础(游标)

    #### 三、游标的声明与使用 ##### 3.1 声明游标 声明游标的基本语法如下: ```plsql DECLARE CURSOR c_name IS SELECT column_list FROM table_name WHERE condition; BEGIN -- 执行逻辑 END; ``` 其中,`c...

    PLSQL 存储过程 游标使用

    PLSQL 存储过程 语法

    Oralce PLSQL存储过程之游标实践!

    #### 二、基础知识回顾 1. **游标**:在PL/SQL中,游标是一种数据库对象,它指向一个SQL查询的结果集。通过游标,我们可以在程序中逐行地访问查询结果,这使得我们可以更灵活地处理数据。 2. **声明游标**:在PL/...

    PLSQL编程(游标).docx

    在PL/SQL编程中,游标(Cursor)是一种非常重要的数据处理工具,它允许程序员逐行处理查询结果集。游标对于那些需要遍历数据库记录并进行操作的情况尤其有用。以下将详细介绍PL/SQL中游标的使用方法: 1. **声明...

    Oracle PLSQL游标的学习

    三、游标的属性 Oracle 游标有 4 个属性:%ISOPEN、%FOUND、%NOTFOUND、%ROWCOUNT。 * %ISOPEN 判断游标是否被打开,如果打开 %ISOPEN 等于 true,否则等于 false。 * %FOUND 判断游标所在的行是否有效,如果有效...

    学习及练习PLSQL-游标遍历

    游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。

    PLSQL中显示游标使用的4个步骤

     显式游标处理需四个 PLSQL步骤:  1、定义/声明游标:是定义一个游标名,以及与其相对应的SELECT 语句。  格式:  CURSOR cursor_name[(parameter[, parameter]…)]  [RETURN datatype]  IS  ...

    PLSQL游标编程培训内含实例

    通过PLSQL游标编程,我们可以实现更灵活的数据处理,比如循环处理结果集、条件判断等。在实际开发中,游标尤其适用于那些需要逐行处理大量数据的情况,例如批量更新或删除。 在"PLSQL培训内容"这个压缩包中,可能...

    福建省电力公司oracle培训教材--PLSQL之游标与异常处理

    福建省电力公司oracle培训教材--PLSQL之游标与异常处理

    plsql游标、集合简单使用

    oracle数据库里plsql游标、集合及对象的简单使用,适合初学者查看

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

    在这个“整理:Oracle PL/SQL 入门+数组使用+游标+动态SQL”文档中,我们将深入探讨这四个关键概念。 1. Oracle PL/SQL入门: - PL/SQL的基本结构:PL/SQL由声明部分、执行部分和异常处理部分组成,用于定义变量、...

    Oracle_PLSQL游标的学习

    Oracle PL/SQL 游标的学习 游标是 Oracle PL/SQL 中的一个重要概念,它允许用户访问和操作结果集中的数据。游标可以理解为是一个映射在结果集中的一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一...

    plsql 游标 英文讲义

    游标(Cursor)是数据库编程中的一个重要概念,它为数据库查询操作提供了一种能够逐行处理结果集的机制。在PL/SQL(Procedure Language extensions to SQL)中,游标分为隐式游标和显式游标两种。 首先,我们来看...

    PLSQL基础入门手册

    首先,我们要理解PLSQL的基本结构,它由三部分组成:声明部分、执行部分和异常处理部分。声明部分定义变量、游标、记录类型等;执行部分包含SQL语句和PLSQL控制结构;异常处理部分用于捕获和处理运行时错误。 在...

    Oracle_T6_PLSQL与游标.sql

    OraclePL/SQL练习,基本的OraclePL/SQL的语法,游标的在PL/SQL中的使用,如何声明游标,打开游标,提取记录,关闭游标。

    PLSQL学习基础课件PPT

    通过这份“PLSQL基础学习学习课件”,初学者可以逐步了解并掌握PLSQL的基本概念、语法和应用,为进一步的数据库开发和管理打下坚实基础。这份课件将详细解析上述知识点,并通过实例演示如何编写和执行PLSQL代码,...

    PLSQL基础和ORALCE基础

    标题中的“PLSQL基础和ORACLE基础”涵盖了两个主要的数据库技术领域,即PL/SQL(Procedural Language/Structured Query Language)和Oracle数据库的基础知识。PL/SQL是Oracle数据库支持的一种过程化编程语言,而...

    ORACLE 数据库开发_PLSQL基础.doc

    大量源码案例,手把手教你PLSQL数据库开发。内容预览: ---- 第一章 PL/SQL 简介 ---- ---- 第二章 PL/SQL程序结构 ---- ---- 第三章 变量与数据类型 ---- ---- 第四章 PL/SQL控制语句 ---- ---- 第五章 PL/SQL游标 ...

    plsql使用手册、基础知识

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一个编程环境,主要用于管理和操作..."plsql基础"和"使用说明"这两个文件应该涵盖了这些主题的详细内容,是学习PL/SQL的良好起点。

Global site tag (gtag.js) - Google Analytics