PL/SQLでストアドプロシージャやファンクションを定義する際、引数(パラメータ)には3種類のモードがあります。それがIN・OUT・IN OUTです。
これらのモードを適切に使い分けることで、値の受け渡しや処理結果の返却を柔軟に制御できます。この記事では、それぞれのパラメータモードの特徴と使い方、注意点について詳しく解説します。
IN・OUT・IN OUTの違いとは?
PL/SQLで使用される引数モードの概要は以下の通りです。
モード | 用途 | 呼び出し元との関係 |
---|---|---|
IN | 呼び出し元から値を受け取る | 値渡し(読み取り専用) |
OUT | 処理結果を呼び出し元に返す | 参照渡し(書き込み専用) |
IN OUT | 呼び出し元から値を受け取り、変更して返す | 参照渡し(読み書き可能) |
用途に応じて適切なモードを選ぶことが重要です。
INパラメータの例
INパラメータは、プロシージャに外部から値を渡すときに使います。関数の引数と同じように扱われ、呼び出し元の値を変更することはできません。
CREATE OR REPLACE PROCEDURE greet_user(p_name IN VARCHAR2) AS
BEGIN
DBMS_OUTPUT.PUT_LINE('こんにちは、' || p_name || 'さん');
END;
このプロシージャは、名前を受け取って挨拶メッセージを表示するだけの処理です。p_name
の値は変更不可です。
OUTパラメータの例
OUTパラメータは、プロシージャ内部で設定した値を呼び出し元に返す用途で使用します。初期値を与えることはできません。
CREATE OR REPLACE PROCEDURE get_tax(p_price IN NUMBER, p_tax OUT NUMBER) AS
BEGIN
p_tax := p_price * 0.1;
END;
この例では、税込価格を受け取って消費税を計算し、OUTパラメータとして返しています。
DECLARE
v_tax NUMBER;
BEGIN
get_tax(1000, v_tax);
DBMS_OUTPUT.PUT_LINE('税額: ' || v_tax);
END;
IN OUTパラメータの例
IN OUTは、呼び出し元から値を受け取り、それを加工して再度返すパターンで使います。
CREATE OR REPLACE PROCEDURE double_value(p_num IN OUT NUMBER) AS
BEGIN
p_num := p_num * 2;
END;
呼び出し側の変数を直接変更できるため、数値の更新や文字列の加工などに使われます。
DECLARE
v_num NUMBER := 5;
BEGIN
double_value(v_num);
DBMS_OUTPUT.PUT_LINE('2倍後の値: ' || v_num);
END;
注意点とベストプラクティス
- OUTおよびIN OUTパラメータは、必ず値を設定しないとNULLになる
- IN OUTは副作用が大きいため、必要な場合に限定して使う
- 引数の読み取り専用で済むならINを選ぶのが原則
設計段階で「データを受け取るのか」「返すのか」「両方か」を意識して、モードを使い分けるようにしましょう。
まとめ
PL/SQLのプロシージャでは、引数のモードを適切に指定することが非常に重要です。INは値の受け取り、OUTは値の返却、IN OUTは両方を行うために使われます。
処理の目的やデータの流れに応じてモードを正しく設計することで、意図しないバグを防ぎ、保守性の高いコードを書くことができます。プロシージャを設計する際は、各パラメータの役割を明確にし、過不足のない引数構成を心がけましょう。