ここではPL/SQLの宣言部で変数と定数を定義する方法について紹介します。

宣言部について

宣言部は、ストアドプロシージャとストアドファンクションでは「IS ~ BEGIN」の間、SQL*Plus や SQL Developer などのツールで実行する無名ブロックでは「DECLARE ~ BEGIN」の間の部分です。ここに変数や定数を定義します。


ストアドで変数を定義する

以下はストアドプロシージャで変数を定義するサンプルです。

CREATE OR REPLACE PROCEDURE PROC_SAMPLE
IS
    /* 宣言部 */
    w_NAME VARCHAR2(10);

BEGIN
    /* 処理部 */
    w_NAME := '名前';
    DBMS_OUTPUT.PUT_LINE(w_NAME);

EXCEPTION
    /* 例外処理部 */
    WHEN others THEN
        DBMS_OUTPUT.PUT_LINE('Error');
END;
/


無名ブロックで変数を定義する

以下は無名ブロックで変数を定義するサンプルです。

DECLARE
    /* 宣言部 */
    w_NAME VARCHAR2(10);

BEGIN
    /* 処理部 */
    w_NAME := '名前';
    DBMS_OUTPUT.PUT_LINE(w_NAME);

EXCEPTION
    /* 例外処理部 */
    WHEN others THEN
        DBMS_OUTPUT.PUT_LINE('Error');
END;
/


%TYPE属性で変数を定義する

%TYPE属性は、指定されたテーブルの列と同じデータ型の変数を定義できます。テーブルの定義が変更されても変数の定義を変更する必要はありません。

以下は%TYPE属性で変数を定義するサンプルです。

CREATE OR REPLACE PROCEDURE PROC_SAMPLE
IS
    w_EMPNO emp.emp_no%TYPE := '001'; -- 社員番号
    w_NAME  emp.emp_name%TYPE;        -- 氏名

BEGIN
    SELECT emp_name INTO w_NAME FROM emp
    WHERE emp_no = w_EMPNO;
    
    DBMS_OUTPUT.PUT_LINE(w_NAME);

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error');
END;
/


%ROWTYPE属性で変数を定義する

%ROWTYPE属性は、指定されたテーブルやビューと同じ列をまとめて同じデータ型の変数を定義できます。テーブルの定義が変更されても変数の定義を変更する必要はありません。

以下は%ROWTYPE属性で変数を定義するサンプルです。

CREATE OR REPLACE PROCEDURE PROC_SAMPLE
IS
    w_EMP emp%ROWTYPE; -- 社員マスタ

BEGIN
    w_EMP.emp_no := '001';

    SELECT emp_name INTO w_EMP.emp_name FROM emp
    WHERE emp_no = w_EMP.emp_no;

    DBMS_OUTPUT.PUT_LINE(w_EMP.emp_name);

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error');
END;
/


定数を定義する(CONSTANT)

定数を使用するには、CONSTANTキーワードを使用します。

以下は定数を定義するサンプルです。

CREATE OR REPLACE PROCEDURE PROC_SAMPLE
IS
    con_EMPNO CONSTANT VARCHAR(3) := '001';
    w_EMP emp%ROWTYPE;

BEGIN
    SELECT emp_name INTO w_EMP.emp_name FROM emp
    WHERE emp_no = con_EMPNO;

    DBMS_OUTPUT.PUT_LINE(w_EMP.emp_name);

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error');
END;
/


以上、PL/SQLの宣言部で変数と定数を定義する方法ついて解説しました。