ストアド プロシージャはサーバー側のオブジェクトであり、バインド変数はクライアント側にしか存在しないため、バインド変数を含むプロシージャを作成することはできません。
SQL*Plus を使用していて、いくつかのバインド変数を作成したとします。SQL*Plus を終了すると、作成したバインド変数は存在しなくなります。ただし、ストアド プロシージャはデータベースに永続化する必要があるため、クライアントで作成されてから破棄されたものへの参照を持つことはできません。
バインド変数を参照するプロシージャを作成できないことを示す例を次に示します。
SQL> 変数 i 番号
SQL> exec :i := 0;
PL/SQL プロシージャが正常に完了しました。
SQL> 印刷:i
私
----------
0
SQL> プロシージャ test_proc を作成または置換
2として
3 開始
4 : 私 := 9;
5終了;
6 /
警告: プロシージャはコンパイル エラーで作成されました。
SQL> エラー手順 test_proc を表示します。
PROCEDURE TEST_PROC のエラー:
LINE/COLエラー
-------- ---------------------------------------------- -----------------------
4/3 PLS-00049: バインド変数 'I' が正しくありません
OUT
ただし、プロシージャのパラメータとしてバインド変数を渡すことはできます。その後、プロシージャはパラメータに値を割り当てることができ、OUT
この値はバインド変数に格納されます。
次の手順があるとします。
CREATE OR REPLACE PROCEDURE do_stuff (
p_output OUT INTEGER
)
AS
BEGIN
p_output := 6;
END;
これを使用して、次のようにバインド変数を設定できます。
SQL> 変数 i 番号
SQL> exec :i := 0;
PL/SQL プロシージャが正常に完了しました。
SQL> 印刷:i
私
----------
0
SQL> exec do_stuff(:i);
PL/SQL プロシージャが正常に完了しました。
SQL> 印刷:i
私
----------
6