PLSQL入门与精通(第9章:游标的打开取得关闭)

上一章程序中的游光定义和游标记录变量定义为中心进行了解说,
这次以执行部游标处理的记述为中心进行解说。
也就是说,“游标的打开、取得、关闭”。

例子程序如下。指定部门编号,显示该员工的一览表。

▼▼例子程序的内容行编号是为了便于说明。▼▼
1 set serveroutput on
2 set verify off
3 DECLARE
4 /显式光标的声明/
5 CURSOR CUR_EMP IS
6 SELECT EMPNO, ENAME FROM EMP
7 WERE DEPTNO=&部门编号;
8 /记录类型变量的声明/
9 REC CUR_EMP%ROWTYPE;
10 BEGIN
11/打开光标/
12 OPEN CUR_EMP;
13/1行取得的同时画面显示/
14 LOOP
15 FETCH CUR_EMP INTO REC;
16 EXIT WHEN CUR_EMP%NOTFOUND;
17 DBMS_OUTPUT.PUT_LINE(REC.EMPNO || ’ ’ || REC.ENAME);
18 END LOOP;
19/关闭光标/
20 CLOSE CUR_EMP;
21 END;
22 /
23 set verify on

▲▲▲▲结束▲▲

文件(例如test.sql)中写下(但是行编号除外)可以从SQLPlus中执行。
以下是SQL
Plus的执行情况:

▼▼▼开始▼
SQL> @test.sql
请在部门编号中输入值:20
7369 SMITH
7566 JONES
7788 SCOTT
7876 ADAMS
7902 FORD PL/SQL过程正常完成。
▲▲▲▲结束▲▲

这样,指定部门号码(DEPTNO)查询员工表(EMP),在画面上显示相应的多个员工的职员号码(EMPNO)和职员名(ENAME)。

那么,这次以这个例子程序为基础,以执行部的处理为中心进行说明。

在执行部中,将游标作为游标处理的第一步打开(例子的第12行)。
结构如下:

OPEN 游标名;

在打开游标处理中,执行游标所在的SELECT语句。然后将结果行的集合
放到在存储器中。该行的集合称为“结果集”。从该结果集中取出一行,可保存在变量中。把那个处理称为取得(第15行)。
重复取得,可以从结果集的第一行开始按顺序取行。取得语法如下:

FETCH 光标名 INTO 记录变量;

程序通常会反复取得,用该行记录进行某种处理,再取得下一行进行同样的处理,所以提取处理和该行记录处理是重复处理。
虽然有几个记述重复处理的方法,但是最简单的方法是将循环处理
用“LOOP”和“END LOOP;”包围。这被称为基本循环语法。
例子程序也使用基本循环。(第14-18行)

不仅是游标处理,在循环中非常重要的是注意不要变成无限循环。
例如,重复提取处理,即使在结果集的最后一行上取得,系统错误也不会发生。也就是说,如果没有在某些条件下从重复中去掉的记述,即使超过了最后一行,也会一直反复取的。这就是所谓无限循环。
如果超出最后一行取得时发生错误的话,控制就会转移到异常处理部,所以不会变成无限循环,但实际上并非如此。超过最后一行取得时,需要自己判断,然后从循环中自动退出。
记述如下:(第16行)

EXIT WHEN 游标名%NOTFOUND;

这个语法的意思是“如果游标名%NOTFOUND是TRUE的话,请从循环中退出”。这里,“游标名%NOTFOUND”的记述是游标的属性之一,超过最后一行取得时,值为TRUE。也就是说,如果把这个语法放在循环里,在没有取得行的时候,就可以从循环中退出,而不是无限循环。

详细说明一下,在取得最后一行的时候游标名%NOTFOUND不是TRUE。再取得一次就可以识别出没有行,游标名%NOTFOUND就是TRUE。因此,“EXIT WHEN 光标名%NOTFOUND;”一般是在取得处理之后紧接着记述。

不管怎样,如果变成了无限循环的话,必须强制结束。所以,请注意无限循环。

即使所有行的提取都结束了,“结果集”仍留在记忆中。提取总是移动到下一行的结果集,并且不能取回先前取得的行。因此,所有行的提取结束后的结果集是无用的,应该快速打开并将区域恢复到内存。那就是所谓的关闭处理(第20行)。
关闭处理的语法如下所示:

CLOSE 游标名;

通过该关闭处理打开结果集,游标处理全部结束。

到此为止,就掌握了从数据库查询,对结果进行行一行一行地处理了。

总结如下。

DECLARE
游标声明(SELECT语句)
声明记录变量
BEGIN
OPEN 游标;
LOOP
FETCH 游标名 INTO 游标记录变量
EXIT WHEN 游标名%NOTFOUND;
针对记录变量进行处理;
END LOOP;
CLOSE光标;
END;

这就是本章内容。比较详细希望大家能够理解。

猜你喜欢

转载自blog.csdn.net/niusr_1980_01/article/details/113971586