アプリケーションからのストアード・プロシージャーの呼び出し
ストアドプロシージャを実行するには、クライアントプログラムから呼び出すか、 Db2 command line processor から起動します。
始める前に
- CALL ステートメントで参照されるストアード・プロシージャーを実行するための許可。
必要となる許可は、CALL ステートメントの形式が CALL procedure-name であるか、または CALL :host-variable であるかによって異なります。
- ストアード・プロシージャーが呼び出すトリガーまたはユーザー定義関数を実行するための許可。
- ストアード・プロシージャー・パッケージ、およびそのストアード・プロシージャー・パッケージの
下のすべてのパッケージを実行するための許可
例えば、ストアード・プロシージャーがユーザー定義関数を呼び出す場合、それらのユーザー定義関数のパッケージを実行するための許可が必要です。
このタスクについて
- 複数のストアード・プロシージャーを呼び出す。
- 単一のストアード・プロシージャーを、
同一レベルまたは別レベルのネストで、複数回呼び出す。 ただし、呼び出し間でストアード・プロシージャーの変数がそのまま残るとは想定しないでください。
ストアドプロシージャがメインプログラムとして実行される場合、 Language Environment® は各呼び出し前に、ストアドプロシージャが使用するストレージを再初期化します。 ストアード・プロシージャー用のプログラム変数は、 ある呼び出しから次の呼び出しの間ではそのまま残っていません。
ストアドプロシージャがサブプログラムとして実行される場合、 Language Environment は呼び出し間のストレージを初期化しません。 ストアード・プロシージャーのプログラム変数は、ある呼び出しから次の呼び出しの間は そのまま残しておくことができます。 しかし、以下の理由から、プログラム変数が、あるストアード・プロシージャー呼び出しから別のストアード・プロシージャー呼び出しまで使用可能であると想定すべきではありません。- 他のユーザーが作成したストアドプロシージャは、 Language Environment のインスタンス内で、あなたのストアドプロシージャの実行と実行の間に実行される可能性があります。
- 1 つのストアード・プロシージャーを連続して実行すると、異なるストアード・プロシージャー・アドレス・スペースで実行される場合があります。
- z/OS® 演算子は、ストアドプロシージャの実行の間に Language Environment を更新する可能性があります。
- ローカル・ストアード・プロシージャーまたはリモート・ストアード・プロシージャーを呼び出す。
クライアントとサーバーの両方のアプリケーション環境が 2 フェーズ・コミット をサポートしている場合、コーディネーターはアプリケーション、サーバー、 およびストアード・プロシージャーの間の更新を制御します。 このいずれかが 2 フェーズ・コミットをサポートしていなければ、更新は失敗します。
- CALL ステートメントをその他の SQL ステートメントと混用する。
- いずれかのDb2 接続機能を使用します。
Db2呼び出し側アプリケーションの Db2スレッドの下にストアドプロシージャを実行します。つまり、ストアドプロシージャは呼び出し元の作業単位の一部であることを意味します。
- ODBC アプリケーションについては、 Db2 ODBC アプリケーションのストアドプロシージャ呼び出しを参照してください。
- JDBC アプリケーションについては、「 JDBC アプリケーションにおけるストアドプロシージャの呼び出し 」を参照してください
プロシージャー
アプリケーションからストアード・プロシージャーを呼び出すには、次のようにします。
例
- 例 1: 簡単なCALL ステートメント
- 次の例は、ストアード・プロシージャー A を呼び出すために使用する単純な CALL ステートメントを示しています。
この例において、:EMP 、:PRJ、:ACT、:EMT、:EMS、:EME、:TYPE、および :CODE は、 アプリケーション・プログラムで前に宣言したホスト変数です。EXEC SQL CALL A (:EMP, :PRJ, :ACT, :EMT, :EMS, :EME, :TYPE, :CODE); - 例2:複数のパラメータ値のホスト構造の使用
- 単純な CALL ステートメントの例で示したように、各パラメーターを別々に渡す代わりに、それらをホスト構造としてまとめて渡すことができます。 例えば、アプリケーション内で次のホスト構造を定義したとします。
その後、次の CALL ステートメントを発行してストアード・プロシージャー A を呼び出すことができます。struct { char EMP[7]; char PRJ[7]; short ACT; short EMT; char EMS[11]; char EME[11]; } empstruc;EXEC SQL CALL A (:empstruc, :TYPE, :CODE); - 例 3: リモート・ストアード・プロシージャーの呼び出し
- 次の例は、明示的に LOCA に接続してから CALL ステートメントを発行する方法を示しています。
EXEC SQL CONNECT TO LOCA; EXEC SQL CALL SCHEMAA.A (:EMP, :PRJ, :ACT, :EMT, :EMS, :EME, :TYPE, :CODE); - 次の例は、CALL ステートメントでストアード・プロシージャー A の 3 部構成の名前を指定することにより、暗黙的に LOCA に接続する方法を示しています。
EXEC SQL CALL LOCA.SCHEMAA.A (:EMP, :PRJ, :ACT, :EMT, :EMS, :EME, :TYPE, :CODE);
- 次の例は、明示的に LOCA に接続してから CALL ステートメントを発行する方法を示しています。
- 例 4: NULL 値を持つ可能パラメーターの引き渡し
- 上記の例では、入力パラメーターはいずれも NULL 値を持てないものとしています。 次の例は、パラメーター・リストで標識変数を渡すことにより、パラメーターに NULL 値を使用できるようにする方法を示しています。
この例で、:IEMP、:IPRJ、:IACT、:IEMT、:IEMS、:IEME、:ITYPE、および :ICODE は、パラメーターの標識変数です。EXEC SQL CALL A (:EMP :IEMP, :PRJ :IPRJ, :ACT :IACT, :EMT :IEMT, :EMS :IEMS, :EME :IEME, :TYPE :ITYPE, :CODE :ICODE); - 例 5: 文字列定数と NULL 値を渡す
- 次の CALL ステートメントの例は、整数と文字ストリングの定数、NULL 値、およびいくつかのホスト変数を渡します。
EXEC SQL CALL A ('000130', 'IF1000', 90, 1.0, NULL, '2009-10-01', :TYPE, :CODE); - 例 6: ストアード・プロシージャー名にホスト変数を使用します。
- 次の CALL ステートメントの例では、ストアード・プロシージャーの名前にホスト変数を使用します。
EXEC SQL CALL :procnm (:EMP, :PRJ, :ACT, :EMT, :EMS, :EME, :TYPE, :CODE);ストアード・プロシージャー名はAであるとします。 ホスト変数 procnm は、長さが 255 以下の文字変数で、値「A」が含まれている文字変数です。 この方法を使用するのは、ストアード・プロシージャーの名前が事前には不明であるが、パラメーター・リスト規則は判明している場合です。
- 例 7: SQLDA を使って、パラメーターを単一の構造で渡します。
- 次の CALL ステートメントの例は、別々のホスト変数としてではなく、単一構造 SQLDA でパラメーターを渡す方法を示しています。
EXEC SQL CALL A USING DESCRIPTOR :sqlda;sqlda は SQLDA の名前です。
SQLDA を使用することのメリットの 1 つは、ストアード・プロシージャー・パラメーター値のコード化スキームを変更できることです。 例えば、ストアード・プロシージャーが実行されるサブシステムが EBCDIC コード化スキームを使用している場合に、データを ASCII CCSID 437 で取り出すには、出力パラメーターの CCSID を SQLDA の SQLVAR フィールドに指定できます。
パラメーターの CCSID をオーバーライドする手法は、変数の CCSID をオーバーライドする手法と同じです。 この手法では、プログラムに可変リスト SELECT ステートメント用の動的 SQL を組み込みます。 この技法を使用する場合は、 パラメーターに対して定義したコード化スキームが SQLDA に指定したコード化スキームとは 異なっている必要があります。 それ以外の場合、変換は行われません。
パラメーターに対して定義されたコード化スキームとは、CREATE PROCEDURE ステートメントで指定したコード化スキームです。 このステートメントでコード化スキームを指定しなかった場合、パラメーターに対して定義されたコード化スキームが、サブシステムのデフォルトのコード化スキームになります。
- 例8: 再使用可能な CALL ステートメント
- 次の CALL ステートメントの例は、ストアード・プロシージャーにホスト変数名、パラメーター・リストに SQLDA を使用するため、異なるパラメーター・リストを使用する異なるストアード・プロシージャーの呼び出しに再利用できます。
EXEC SQL CALL :procnm USING DESCRIPTOR :sqlda;クライアント・プログラムは、ストアード・プロシージャー名をホスト変数 procnm に割り当てて、SQL CALL ステートメントを発行する前に SQLDA を パラメーター情報とともにロードしなければなりません。