记录一个可以存储不同数据类型值的复合变量,与C,C++或JAVA的结构体类似。PL/SQL记录对保存表行数据或确定表行列有用。为了便于维护,可以声明表类型或游标类型变量,而不用创建新的记录类型。
1.声明记录
记录作为一个整体本身并没有值,不过每个单独成员或者字段都有值。PL/SQL中可以通过以下3种方法定义:
1.1基于表的记录类型
用表名加%ROWTYPE属性的方法可以声明一个记录类型,该记录类型的每个字段都和表中的一列相互对应,同时具有相同的名字。
DECLARE
dept_info departments%ROWTYPE;
1.2基于游标的记录类型
对显示声明的游标或者游标变量加上%ROWTYPE的方法声明一个基于游标的记录类型,这个记录类型和游标具有相同的结构。
DECLARE
CURSOR c1 IS
SELECT department_id, department_name, location_id
FROM departments;
rec1 c1%ROWTYPE;
1.3自定义的记录类型
用TYPE...RECORD语句可以定义记录类型,该记录类型的字段名称和字段类型都需要明确定义,字段类型甚至可以是另一个记录类型。
DECLARE
TYPE DeptRec1 IS RECORD
(dept_num NUMBER(2), dept_name VARCHAR2(14));
dept1_info DeptRec1;
(注意:根据一个记录类型声明记录时,不需要使用%ROWTYPE)
%ROWTYPE声明格式:
record_name [schema_name.]object_name%ROWTYPE [DEFFAULT | := compatible_record];
其中object_name可以是一个显示游标、游标变量、表、视图或者同义词。
下面是基于一个游标变量创建记录类型的例子:
declare
type vc_depart ref return departments%rowtype;
dept_info vc_depart%rowtype;
begin
null;
end;
2.定义记录类型
语法:
record_type_definition:
TYPE type_name IS RECORD
( field_declaration [, field_declaration]... ) ;
field_declaration:
field_name datatype [ [ NOT NULL ] { := | DEFAULT } expression ]
record_type_declaration:
record_name type_name ;
EXAMPlE:
declare
type timerec is record(
hours smallint,
minutes smallint);
type meeting_type is record(
date_held date,
duration timerec, -- NESTED RECORD
location varchar2(20),
purpose varchar2(50));
begin
null;
end;