変数宣言内の %TYPE 属性 (PL/SQL)

PL/SQL 変数およびパラメーター宣言で使用する %TYPE 属性は、 データ・サーバーでサポートされます。この属性を使用することにより、表の列と PL/SQL 変数の間でタイプの互換性が確実に維持されます。

ドット表記の修飾された列名、または既に宣言されている変数の名前を、%TYPE 属性の接頭部として指定する必要があります。 この列または変数のデータ・タイプが、宣言する変数に割り当てられます。 列または変数のデータ・タイプが変更されても、宣言コードを変更する必要はありません。

%TYPE 属性を仮パラメーターの宣言で使用することもできます。

構文

構文図を読む構文図をスキップするnametableview.columnvariable%TYPE

説明

name
宣言する変数または仮パラメーターの識別子を指定します。
table
参照する列がある表の識別子を指定します。
view
参照する列があるビューの識別子を指定します。
column
参照する表列またはビュー列の識別子を指定します。
variable
参照する、既に宣言されている変数の識別子を指定します。 この変数は、その他の列属性 (NULL 可能属性など) を継承しません。

以下の例に示すプロシージャーでは、従業員番号を使用して EMP 表を照会し、同従業員のデータを表示し、同従業員が所属する部門内の全従業員の平均給与を調べ、次いで選択した同従業員の給与と部門の平均給与を比較します。
CREATE OR REPLACE PROCEDURE emp_sal_query (
    p_empno         IN CHAR(6)
)
IS
    v_lastname      VARCHAR2(15);
    v_job           VARCHAR2(8);
    v_hiredate      DATE;
    v_salary        NUMBER(9,2);
    v_workdept      CHAR(3);
    v_avgsal        NUMBER(9,2);
BEGIN
    SELECT lastname, job, hiredate, salary, workdept
        INTO v_lastname, v_job, v_hiredate, v_salary, v_workdept
        FROM emp WHERE empno = p_empno;
    DBMS_OUTPUT.PUT_LINE('Employee # : ' || p_empno);
    DBMS_OUTPUT.PUT_LINE('Name       : ' || v_lastname);
    DBMS_OUTPUT.PUT_LINE('Job        : ' || v_job);
    DBMS_OUTPUT.PUT_LINE('Hire Date  : ' || v_hiredate);
    DBMS_OUTPUT.PUT_LINE('Salary     : ' || v_salary);
    DBMS_OUTPUT.PUT_LINE('Dept #     : ' || v_workdept);

    SELECT AVG(salary) INTO v_avgsal
        FROM emp WHERE workdept = v_workdept;
    IF v_salary > 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@
このプロシージャーを、宣言セクションで EMP 表の各データ・タイプを明示的にコーディングしないように書き換えることができます。
CREATE OR REPLACE PROCEDURE emp_sal_query (
    p_empno         IN emp.empno%TYPE
)
IS
    v_lastname      emp.lastname%TYPE;
    v_job           emp.job%TYPE;
    v_hiredate      emp.hiredate%TYPE;
    v_salary        emp.salary%TYPE;
    v_workdept      emp.workdept%TYPE;
    v_avgsal        v_salary%TYPE;
BEGIN
    SELECT lastname, job, hiredate, salary, workdept
        INTO v_lastname, v_job, v_hiredate, v_salary, v_workdept
        FROM emp WHERE empno = p_empno;
    DBMS_OUTPUT.PUT_LINE('Employee # : ' || p_empno);
    DBMS_OUTPUT.PUT_LINE('Name       : ' || v_lastname);
    DBMS_OUTPUT.PUT_LINE('Job        : ' || v_job);
    DBMS_OUTPUT.PUT_LINE('Hire Date  : ' || v_hiredate);
    DBMS_OUTPUT.PUT_LINE('Salary     : ' || v_salary);
    DBMS_OUTPUT.PUT_LINE('Dept #     : ' || v_workdept);

    SELECT AVG(salary) INTO v_avgsal
        FROM emp WHERE workdept = v_workdept;
    IF v_salary > 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@
p_empno パラメーターは、%TYPE 属性を使用して定義する仮パラメーターの例です。 v_avgsal 変数は、表の列の代わりに別の変数を参照する %TYPE 属性の例です。
以下は、EMP_SAL_QUERY プロシージャーを呼び出すことによって生成される出力例です。
SET SERVEROUTPUT ON@
CALL emp_sal_query('200340')@

Employee # : 200340
Name       : ALONZO
Job        : FIELDREP
Hire Date  : 1997-07-05-00.00.00
Salary     : 31840
Dept #     : E21
Employee's salary does not exceed the department average of 47086.67