%TYPE属性提供了创建依赖列的数据类型的变量的简单方法。使用%ROWTYPE属性,您可以定义包含对应于给定表的所有列的字段的记录。每个字段都采用其对应列的数据类型。记录中的字段不继承列的任何其他属性,例如可能使用NOT NULL子句或DEFAULT子句指定的属性。

记录 是指定的、有序的字段集合。字段 类似于变量;它具有标识符和数据类型,但还具有属于记录的其他属性,并且必须采用圆点表示法将记录名称作为其限定符来进行引用。

您可以使用 %ROWTYPE 属性来声明记录。%ROWTYPE 属性以表名为前缀。指定表中的每个列定义记录中具有与列相同的数据类型的同名字段。

record table%ROWTYPE;

record 是分配给记录的标识符。table 是其列用于定义记录中的字段的表(或视图)的名称。以下示例显示上一节中的 emp_sal_query 存储过程可如何修改以使用 emp%ROWTYPE 创建名为 r_emp 的记录,而非为 emp 中的各列声明各个变量。

CREATE OR REPLACE PROCEDURE emp_sal_query (
    p_empno         IN emp.empno%TYPE
)
IS
    r_emp           emp%ROWTYPE;
    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;