PL/SQL ストアドプロシージャのパラメータの種類

ストアド・サブプログラムのパラメータには データ型 情報以外にパラメータ・モードというものがある。

パラメータ・モード

パラメータ・モードには IN、OUT、IN OUT (入力、出力、入出力)の 3種類と NOCOPY コンパイラヒントがある。(無指定の場合には IN となる)

NOCOPY ヒント使用時の書式

param_name {OUT|IN OUT} NOCOPY data_type_name

IN には NOCOPY は指定できない

パラメータモードと制限事項

モード x 適用事項IN (デフォルト)OUTINOUT
指定可能なパラメータの種類コンスタント、リテラル、変数、式変数変数
デフォルト値の使用不可(※1)不可
プロシージャ内で値の代入不可
終了時のパラメータの保持呼び出し前の状態のまま初期化済み(※1)代入された場合には代入した値
代入処理が無ければ呼び出し前の値のまま
値の複製再代入できないが参照渡しされる
(≒ 常に NOCOPY)
デフォルトでは値渡しされる
NOCOPY 有効時は参照渡し
同左

(※1) OUT 仮パラメータは初期処理として暗黙的に NULL に初期化される(※2) 。正常終了の場合でプログラム内で代入処理が存在しない場合 には NULL が戻される。
但し、例外の未処理によって例外発生終了する場合には実パラメータに代入されない。つまり 実パラメータの値は保持される。⇒ NOCOPY ヒント も参照のこと

(※2) OUT 仮パラメータを NULL に初期化する処理があるために OUT パラメータのデータ型には NOT NULL 制約のあるデータ型を使用するとコンパイルエラーではなく 基本的に実行時エラー(※3) となる。NATURALN、POSITIVEN サブタイプには NOT NULL 制約が含まれる。
参考: PL/SQL のデータ型

(※3) ホスト変数を使用している場合にはエラーにならないケースがある。

NOCOPY ヒント

NOCOPY の指定は OUT および IN OUT ディレクティブ表記に続いて指定するコンパイラヒントである。

NOCOPY を指定しない場合(デフォルト)には実パラメータはスタック領域に複製されて仮パラメータ「値渡し」される。 そして 正常終了した場合に仮パラメータの内容を実パラメータに反映する。

NOCOPY ヒントを指定すると、そのパラメータは実パラメータを「参照渡し」にする。 NOCOPY が有効になっている場合には正常終了、例外未処理による例外終了に関わらず実パラメータの変更は取り消されない。

IN OUT 「ディレクティブ」 と NOCOPY 「ヒント」

NOCOPY はヒントであることから常に適用されるものではない。つまり NOCOPY を指定しても「値渡し」が無効な場合や実行時に変換されることがある。(「値渡し」変換されるだけでエラーにはならない)

NOCOPY が適用できないケース

  • 暗黙変換が発生する
  • リモートプロシージャ(DBリンク)、または、外部プロシージャ
  • 実パラメータに数値の位取りや NOT NULL などの制約がある(※4) ⇒ 参考: データ型
  • 実パラメータが 「結合配列要素」 (≠結合配列全体)
  • %ROWTYPE、%TYPE、FOR によるカーソル定義 を使用した レコード型 で実パラメータと仮パラメータ間のフィールドの制約が一致しない

(※4) VARCHAR2(xx) などの文字列長制限、制約付きの要素またはコンポジット型の属性は含まれない。



関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト