レコード・タイプ宣言内の %ROWTYPE 属性 (PL/SQL)

%ROWTYPE 属性は、表またはビューの各列に対応したフィールドで構成されるタイプ・レコードの PL/SQL 変数を宣言するときに使用します。この属性は、 データ・サーバーでサポートされます。PL/SQL レコード内の各フィールドには、表内の対応する列のデータ・タイプが付与されます。

レコード とは、複数のフィールドからなる、名前が付いた順序付きコレクションのことです。 フィールド は変数に似ていて、ID およびデータ・タイプがありますが、レコードにも属しており、レコード名を修飾子にしてドット表記の使用により参照する必要があります。

構文

構文図を読む構文図をスキップするrecordtableview%ROWTYPE

説明

record
レコードの識別子を指定します。
table
レコード内のフィールドを定義するために使用する列定義を持つ表の識別子を指定します。
view
レコード内のフィールドを定義するために使用する列定義を持つビューの識別子を指定します。
%ROWTYPE
レコード・フィールドのデータ・タイプを、指定した表またはビューに関連付けられた列のデータ・タイプから取得することを指定します。 レコード・フィールドは、その他の列属性 (NULL 可能属性など) を継承しません。

以下の例では、EMP 表の列の変数を個別に宣言する代わりに、%ROWTYPE 属性を使用してレコード (r_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;