【PL/SQL】IN・OUT・IN OUTパラメータの使い分け|プロシージャ引数の基本

【PL/SQL】IN・OUT・IN OUTパラメータの使い分け|プロシージャ引数の基本 PL/SQL

PL/SQLでストアドプロシージャやファンクションを定義する際、引数(パラメータ)には3種類のモードがあります。それがINOUTIN 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は両方を行うために使われます。

処理の目的やデータの流れに応じてモードを正しく設計することで、意図しないバグを防ぎ、保守性の高いコードを書くことができます。プロシージャを設計する際は、各パラメータの役割を明確にし、過不足のない引数構成を心がけましょう。