変数宣言内の %TYPE 属性 (PL/SQL)
PL/SQL 変数およびパラメーター宣言で使用する %TYPE 属性は、 データ・サーバーでサポートされます。この属性を使用することにより、表の列と PL/SQL 変数の間でタイプの互換性が確実に維持されます。
ドット表記の修飾された列名、または既に宣言されている変数の名前を、%TYPE 属性の接頭部として指定する必要があります。 この列または変数のデータ・タイプが、宣言する変数に割り当てられます。 列または変数のデータ・タイプが変更されても、宣言コードを変更する必要はありません。
%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