本节介绍如何定义不依赖于任何特定表定义的新记录结构。

使用 %ROWTYPE 属性可以基于表定义声明记录,详情请参见在记录声明中使用 %ROWTYPE

记录类型

记录类型是由一个或多个标识符及其相应数据类型组成的记录的定义,记录类型本身不能用于操作数据。您可以使用TYPE IS RECORD语句创建记录类型的定义。

TYPE IS RECORD 语句的语法为:

TYPE rec_type IS RECORD ( fields )

其中 fields 是以下形式的一个或多个字段定义的逗号(,)分隔列表:

field_name data_type [NOT NULL][{:= | DEFAULT} default_value]

其中:

参数 说明
rec_type rec_type是分配给记录类型的标识符。
field_name field_name 是分配给记录类型的字段的标识符。
data_type data_type 指定 field_name 的数据类型。
DEFAULT default_value DEFAULT 子句为对应字段分配默认数据值。默认表达式的数据类型必须与列的数据类型相匹配。如果没有指定默认值,则默认值为 NULL。

记录变量

记录变量或简单地说记录是记录类型的实例。通过记录类型声明记录。记录的属性(如其字段名称和类型)继承自记录类型。

下面是记录声明的语法。

record rectype

record 是分配给记录变量的标识符。rectype 是以前定义的记录类型的标识符。声明后,记录可用于保存数据。

英文句号(.)表示法用于引用记录中的字段。

record.field

record 是以前声明的记录变量,field 是属于从其定义 record 的记录类型的字段的标识符。

再次修改 emp_sal_query ,这次使用用户定义的记录类型和记录变量。

CREATE OR REPLACE PROCEDURE emp_sal_query (
    p_empno         IN emp.empno%TYPE
)
IS
    TYPE emp_typ IS RECORD (
        ename       emp.ename%TYPE,
        job         emp.job%TYPE,
        hiredate    emp.hiredate%TYPE,
        sal         emp.sal%TYPE,
        deptno      emp.deptno%TYPE
    );
    r_emp           emp_typ;
    v_avgsal        emp.sal%TYPE;
BEGIN
    SELECT ename, job, hiredate, sal, deptno
        INTO r_emp.ename, r_emp.job, r_emp.hiredate, r_emp.sal, r_emp.deptno
        FROM emp WHERE empno = p_empno;
    DBMS_OUTPUT.PUT_LINE('Employee # : ' || p_empno);
    DBMS_OUTPUT.PUT_LINE('Name       : ' || r_emp.ename);
    DBMS_OUTPUT.PUT_LINE('Job        : ' || r_emp.job);
    DBMS_OUTPUT.PUT_LINE('Hire Date  : ' || r_emp.hiredate);
    DBMS_OUTPUT.PUT_LINE('Salary     : ' || r_emp.sal);
    DBMS_OUTPUT.PUT_LINE('Dept #     : ' || r_emp.deptno);

    SELECT AVG(sal) INTO v_avgsal
        FROM emp WHERE deptno = r_emp.deptno;
    IF r_emp.sal > v_avgsal THEN
        DBMS_OUTPUT.PUT_LINE('Employee''s salary is more than the '
            || 'department average of ' || v_avgsal);
    ELSE
        DBMS_OUTPUT.PUT_LINE('Employee''s salary does not exceed the '
            || 'department average of ' || v_avgsal);
    END IF;
END;

请注意,无需指定数据类型名称,可以为记录类型定义中的字段数据类型使用 %TYPE 属性。

下面是执行此存储过程的输出。

EXEC emp_sal_query(7698);

Employee # : 7698
Name       : BLAKE
Job        : MANAGER
Hire Date  : 01-MAY-81 00:00:00
Salary     : 2850.00
Dept #     : 30
Employee's salary is more than the department average of 1566.67