游标有两种:
显示游标,隐式游标
显示游标是用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;
注意,在上例中,第一次关闭游标变量是可以省略的,因为在第二次打开游标变量是,就将第一次的查询丢失掉了.
分享到:
相关推荐
#### 三、游标的声明与使用 ##### 3.1 声明游标 声明游标的基本语法如下: ```plsql DECLARE CURSOR c_name IS SELECT column_list FROM table_name WHERE condition; BEGIN -- 执行逻辑 END; ``` 其中,`c...
PLSQL 存储过程 语法
#### 二、基础知识回顾 1. **游标**:在PL/SQL中,游标是一种数据库对象,它指向一个SQL查询的结果集。通过游标,我们可以在程序中逐行地访问查询结果,这使得我们可以更灵活地处理数据。 2. **声明游标**:在PL/...
在PL/SQL编程中,游标(Cursor)是一种非常重要的数据处理工具,它允许程序员逐行处理查询结果集。游标对于那些需要遍历数据库记录并进行操作的情况尤其有用。以下将详细介绍PL/SQL中游标的使用方法: 1. **声明...
三、游标的属性 Oracle 游标有 4 个属性:%ISOPEN、%FOUND、%NOTFOUND、%ROWCOUNT。 * %ISOPEN 判断游标是否被打开,如果打开 %ISOPEN 等于 true,否则等于 false。 * %FOUND 判断游标所在的行是否有效,如果有效...
游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
显式游标处理需四个 PLSQL步骤: 1、定义/声明游标:是定义一个游标名,以及与其相对应的SELECT 语句。 格式: CURSOR cursor_name[(parameter[, parameter]…)] [RETURN datatype] IS ...
通过PLSQL游标编程,我们可以实现更灵活的数据处理,比如循环处理结果集、条件判断等。在实际开发中,游标尤其适用于那些需要逐行处理大量数据的情况,例如批量更新或删除。 在"PLSQL培训内容"这个压缩包中,可能...
福建省电力公司oracle培训教材--PLSQL之游标与异常处理
oracle数据库里plsql游标、集合及对象的简单使用,适合初学者查看
在这个“整理:Oracle PL/SQL 入门+数组使用+游标+动态SQL”文档中,我们将深入探讨这四个关键概念。 1. Oracle PL/SQL入门: - PL/SQL的基本结构:PL/SQL由声明部分、执行部分和异常处理部分组成,用于定义变量、...
Oracle PL/SQL 游标的学习 游标是 Oracle PL/SQL 中的一个重要概念,它允许用户访问和操作结果集中的数据。游标可以理解为是一个映射在结果集中的一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一...
游标(Cursor)是数据库编程中的一个重要概念,它为数据库查询操作提供了一种能够逐行处理结果集的机制。在PL/SQL(Procedure Language extensions to SQL)中,游标分为隐式游标和显式游标两种。 首先,我们来看...
首先,我们要理解PLSQL的基本结构,它由三部分组成:声明部分、执行部分和异常处理部分。声明部分定义变量、游标、记录类型等;执行部分包含SQL语句和PLSQL控制结构;异常处理部分用于捕获和处理运行时错误。 在...
OraclePL/SQL练习,基本的OraclePL/SQL的语法,游标的在PL/SQL中的使用,如何声明游标,打开游标,提取记录,关闭游标。
通过这份“PLSQL基础学习学习课件”,初学者可以逐步了解并掌握PLSQL的基本概念、语法和应用,为进一步的数据库开发和管理打下坚实基础。这份课件将详细解析上述知识点,并通过实例演示如何编写和执行PLSQL代码,...
标题中的“PLSQL基础和ORACLE基础”涵盖了两个主要的数据库技术领域,即PL/SQL(Procedural Language/Structured Query Language)和Oracle数据库的基础知识。PL/SQL是Oracle数据库支持的一种过程化编程语言,而...
大量源码案例,手把手教你PLSQL数据库开发。内容预览: ---- 第一章 PL/SQL 简介 ---- ---- 第二章 PL/SQL程序结构 ---- ---- 第三章 变量与数据类型 ---- ---- 第四章 PL/SQL控制语句 ---- ---- 第五章 PL/SQL游标 ...
PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一个编程环境,主要用于管理和操作..."plsql基础"和"使用说明"这两个文件应该涵盖了这些主题的详细内容,是学习PL/SQL的良好起点。