JavaScriptが無効になっています。
この状態では一部の情報が表示されず、すべての機能を利用することができません。
PL/SQL ストアドプロシージャのパラメータの種類
ストアド・サブプログラムのパラメータには データ型 情報以外にパラメータ・モードというものがある。
パラメータ・モード
パラメータ・モードには IN、OUT、IN OUT (入力、出力、入出力)の 3種類と NOCOPY コンパイラヒントがある。(無指定の場合には IN となる)
NOCOPY ヒント使用時の書式
param_name {OUT|IN OUT} NOCOPY data_type_name
IN には NOCOPY は指定できない
パラメータモードと制限事項
モード x 適用事項 IN (デフォルト) OUT INOUT 指定可能なパラメータの種類 コンスタント、リテラル 、変数、式 変数 変数 デフォルト値の使用 可 不可(※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) などの文字列長制限、制約付きの要素またはコンポジット型の属性は含まれない。
関連事項