PLSQL入门与精通(第12章:自定义记录类型)

前边简单解释了一下记录变量,这次详细解说一下记录变量。
到上次为止,已经详细解说了6次明示光标的处理。
回顾之前的内容:
・第3章:基本变量的声明
・第4章:使用%TYPE进行变量声明
・第8章:游标处理,使用%ROWTYPE进行记录变量的声明
如上所述,在第8章中,我们对使用%ROWTYPE的记录变量的定义方法进行了说明,这次将更详细地说明记录变量。
也就是说,不使用%ROWTYPE,而是自己声明记录类型,
然后再声明记录变量的方法。

%ROWTYPE是根据游标和表的定义,定义与该行相同的记录类型时使用的。也就是说,这是一种非常简单的定义和申明方法,可以用来定义与该行的列相同的名称、具有相同数据类型字段的记录类型变量。 例如:
<定义域>
记录变量名 表%ROWTYPE;
记录变量名 游标名%ROWTYPE;

特别是表名%ROWTYPE型的变量,可以作为SELECT * INTO~的代入地址使用,非常轻松。
但是,如果在程序中实际使用取得的行记录不是全部字段,而是部分字段的时候,%ROWTYPE的定义很有可能成为存储器的浪费。
例如
<坏例子,改善前>
SQL> CONNECT user/passwordtiger
已连接。
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 REC EMP%ROWTYPE;
3 BEGIN
4 SELECT * INTO REC FROM EMP WHERE EMPNO=7934;
5 DBMS_OUTPUT.PUT_LINE(REC.ENAME |‘是’||REC.JOB |’;
6 END;
7 /

MILLER是CLERK

PL/SQL过程成功完成。

这里,在第2行(在行号2的地方),定义与EMP表的行相同结构的
记录变量REC,在第4行通过SELECT INTO文取得职员编号7934的
职员的行记录,在第5行使用ENAME Feel和JOB字段,
将“MILLER是CLERK”的结果显示在SQL*Plus的画面上。
好不容易将EMP表中的一行保存到了记录变量REC中,实际使用的字段
只有ENAME和JOB的话,其他的字段就只是毫无意义地浪费了内存。
实际上EMP表的行尺寸并不是很大,所以也没什么问题,但是如果这是
非常频繁地在一行大小很大的一张表上进行这样的处理的话,
就造成内存的浪费。
在这种情况下,只针对实际使用的字段进行声明记录变量
只把实际使用的列作为查询对象。

以下是改善后的例子:
<改善后>
SQL> DECLARE
2 TYPE REC_TYPE IS RECORD
3 ( ENAME VARCHAR2(10),
4 JOB VARCHAR2(9) );
5 REC REC_TYPE;
6 BEGIN
7 SELECT ENAME, JOB INTO REC FROM EMP WHERE EMPNO=7934;
8 DBMS_OUTPUT.PUT_LINE(REC.ENAME |‘是’||REC.JOB |’;
9 END;
10 /

MILLER是CLERK

PL/SQL过程成功完成。

在这里请注意的是,在第2~4行中宣言具有ENAME、JOB两个字段的
记录类型(该类型的名字是REC TYPE)。
然后在第5行中使用REC TYPE型宣布了记录变量REC。
这样记述的话,记录变量REC只有ENAME和JOB两个字段,
所以所占用的内存大小也会变小。
因此,第7行的SELECT INTO代入记录变量时,只以ENAME列和JOB
列为查询对象。之后的处理和改善前一样。
因此,这里不是使用%ROWTYPE来定义现有表的所有字段的记录,
而是自己定义自己想要使用的类型,并使用该类型来声明记录变量。
因此,定义分为两个阶段:
(声明类型,声明使用该类型的变量)。
作为语法总结如下:
<类型声明>
TYPE 类型名称 IS RECORD
(字段名称1数据型,字段名称2数据型,…);
<声明变量>
变量名称 以上类型;

本章到此结束。

猜你喜欢

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