记录类型声明中的 %ROWTYPE 属性 (PL/SQL)

数据服务器支持 %ROWTYPE 属性,此属性用于声明类型为记录的 PL/SQL 变量,该记录的字段与表列或视图列相对应。PL/SQL 记录中的每个字段都采用表中相应列的数据类型。

记录是字段的有序集合,它具有名称。字段与变量类似;它具有标识和数据类型,但还属于某个记录,并且必须在将记录名用作限定符的情况下通过点分表示法进行引用。

语法

阅读语法图跳过直观语法图记录tableview%ROWTYPE

描述

记录
指定记录的标识。
指定一个表的标识,将使用该表的列定义来定义记录中的字段。
视图
指定一个视图的标识,将使用该视图的列定义来定义记录中的字段。
%ROWTYPE
指定根据与所标识表或视图相关联的列数据类型来派生记录字段数据类型。记录字段不会继承任何其他列属性(例如可空属性)。

示例

以下示例说明如何使用 %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;