PLSQL入门与精通(第8章:游标记录变量)

上次介绍了指定部门编号,并在画面上显示该部门员工明细的游标
处理的PL/SQL例子程序,本章内容将进一步进行说明。

上次的例子程序如下:

▼▼从这里开始上次样本的内容行编号是为了便于说明的▼▼▼
1 set serveroutput on
2 set verify off
3 DECLARE
4 /游标的声明/
5 CURSOR CUR_EMP IS
6 SELECT EMPNO, ENAME FROM EMP
7 WHERE DEPTNO=&部门编号;
8 /记录类型变量的声明/
9 REC CUR_EMP%ROWTYPE;
10 BEGIN
11/打开游标/
12 OPEN CUR_EMP;
13/逐行取得数据,同时在画面上显示/
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过程正常完成。

▲▲▲▲减到这种程度

这里指定了20个部门号,并显示了该部门员工的明细。

那么,这次就在这一系列的游标处理中,详细说明游标定义的部分
和用来从游标取得行的记录型变量定义的部分。参看例子的第5~9行。

原本游标就是SQL内部使用的结构。
SQL有一个可以用一个命令处理多行的特征,
但内部是以游标的方式逐行进行处理的。
通过程序明确控制游标,可以从返回多行结果的SELECT语句中逐行取出。
像这样在程序中明确操作,所以正式称为显式游标,或者显示,
以下简称为游标。

中,要处理通过PL/SQL程序返回多行的SELECT语句,必须在宣言部基于该SELECT语句宣布光标(5-7行)。正确地说,即使不明确声明光标,也可以从多行SELECT语句中各取得一行,这可以说是应用篇的故事,基本上光标的宣言是必要的。

光标的声明语法如下:

<定义域部>
CURSOR 游标名 IS SELECT语句;

首先,开头需要“CURSOR”这个关键词。

接下来是游标名,可以随便取个名字。
关于名字的规则和变量规则是相同的:“开头不能是数字”、“长度最多30字节”等。

接下来是“IS”。请注意不是“AS”。
在PL/SQL中,“IS”或“AS”都可以,但是游标是“IS”。

接下来是SELECT文,复杂的SELECT文当然也OK。
但是,需要注意的是,SELECT句中如果不是使用列名而是使用公式或函数的话,
请指定简单的列别名。虽然不会发生编译错误,但是不那样做的话,
参照该列的编程会有点麻烦。

例如以下是没有列别名不好的例子:

<不好的游标声明>

CURSOR CUR1 IS SELECT EMPNO, upper(ENAME), SAL * 12 FROM EMP;

上面的游标声明对于“UPper(ENAME)”和“SAL*12”没有指定列别名。

<优秀的游标声明>

CURSOR CUR1 IS SELECT EMPNO, upper(ENAME) UPNAME , SAL * 12 ANNSAL FROM EMP;

在上面的游标宣言中,对“UPper(ENAME)”加上“UPANAME”的别名,
对“SAL*12”加上“ANNSAL”的列别名。
这样之后的操作可以简单地以列别名进行访问。

那么,游标声明到此为止。

接下来是记录类型变量的声明。需要存储从游标获取的行的记录类型变量。

也有不明确声明记录类型变量而使用的方法,这是应用篇的话,基本上需要明确声明记录类型变量。

记录型变量,是列变量的集合,也就是包含所有字段的集合的变量。

下面将介绍记录类型变量的声明方法,该变量具有与游标所在行的列相同名称的字段。(样品的第9行变量名称REC)

<声明与游标行相同类型的记录类型变量>

记录类型变量名 游标名%ROWTYPE;

注意:必须在游标记录变量声明之前(即在上面)声明游标。
也就是先要申明游标,在定义游标记录变量。
根据游标声明创建一个记录类型变量,该变量具有与游标所在的
SELECT语句的列名称或列名称相同的字段。
也就是说,它是与游标行相同类型的记录类型变量。

另外,除了申明游标相关的记录类型之外,也可以直接申明和表
相关的记录类型,例如:

レコード型変数名 表名%ROWTYPE;

要访问记录类型变量的字段,请为该变量加上“.字段名称”。
(例子的第17行REC.EMPNO 、REC.ENAME);

例如,以下是记录类型变量字段的赋值代入。

REC.EMPNO := 100;

以上是记录型变量REC的EMPNO字段代入100的例子。

以上例子之外,也有和表和游标不相关的,单独声明记录类型的变量的方法。
这种情况下,先声明“类型”,然后再定义该类型的变量,这是两个阶段的定义,详细情况将在其他机会介绍。

本次详细说明了游标记录变量。
下次将详细说明游标处理执行部的内容。

猜你喜欢

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