カーソルを必要とする複文リクエスト
複文リクエストは、たびたび複数行の応答を返します。リクエスト内のそれぞれの文は、固有の結果を生成し(成功/失敗、アクティビティ カウントなど)、それらはアプリケーション プログラムに返されます。
複文リクエストの結果テーブルは複数の応答を返すので、結果を取り出して操作するカーソルを宣言することはSYSUDTLIBです。
関連付けるもの | 必須事項 |
---|---|
静的複文リクエストとリクエスト カーソル | リクエスト カーソルに対してDECLARE CURSOR文を出す。 |
動的複文リクエストと動的カーソル | PREPARE文を、複文リクエストを含む文文字列とともに使用する。 動的リクエストは、次に動的カーソルと関連付けられます。 |
PREPAREおよびDESCRIBEでのFOR STATEMENT句の使用
PREPAREおよびDESCRIBEの構文を、FOR STATEMENT句を使って拡張することができます。FOR STATEMENTによって、複文リクエストのどの文を記述するかを指定することができます。
複文リクエストのすべての文を記述するために、DESCRIBE文を、そのリクエスト内のデータを返す文それぞれに対して複数回実行しなければなりません。
出力SQLDAには列記述はありませんが、データを返さない文にDESCRIBEを実行することは必ず有効です。
SQLDAを使用した文の状況の追跡
複文リクエストからの出力を処理する際には、各文が成功したか失敗したか、いつ1つのリクエストからの出力が終了し、次のリクエストからの出力が開始されたかを把握している必要があります。
以下のテーブルによって説明されているメカニズムは、単文リクエストに使用されるものと似ており、次のことを達成するためのフレームワークを提供します。
その場合 | 結果 |
---|---|
リクエスト カーソルがオープンしている | SQLCA内のSQLCODEは、リクエストの最初の文の成功、またはリクエストの失敗(IMPLICIT ROLLBACK発生として定義された失敗)をエンティティとして反映するように設定されます。 失敗条件は、成功レポートをオーバーライドします。 成功した場合、アクティビティ カウントが、SQLCA内の3番目のSQLERRD要素でアプリケーションにレポートされます。 |
文がエラー(非暗黙ROLLBACKとして定義されたエラー) | 次のFETCHが該当する以下のエラー コードを返します。SQLCA内のSQLCODEは< 0、およびSQLERRDの最初の要素のエラー コード。 |
行が返されない、または特定の文に対して返される文が尽きた | SQLCODEは、単文リクエストの場合と同じように、FETCHからの返しに+100を設定します。 |
アプリケーションを次の(または任意の)リクエストの文に置く必要がある | POSITION文を使用します。 POSITIONは、リクエストの指定された文の出力に制御を移し、OPENリクエストの成功または失敗に基づいてSQLCA情報を設定します。 次に、プログラムはFETCHを使用して、文の出力を検索します。 |
アプリケーションをリクエストのすべての出力の先頭に置く必要がある | REWIND文を使用します。 REWIND文は、POSITION TO STATEMENT 1とまったく同等です。 REWINDは、リクエストの指定された文の出力に制御を移し、OPENリクエストの成功または失敗に基づいてSQLCA情報を設定します。 次に、プログラムはFETCHを使用して、文の出力を検索します。 |
現在の文に対して+100 SQLCODEを受け取る | POSITIONまたはREWINDを使用して、別の(または同じ)文の結果にアクセスします。 +100を受け取るまで待機する必要はありません。POSITIONまたはREWIND文はいつでも出すことができます。 |
複文リクエストの例
複文リクエストの例を以下に示します。SQL先頭子および終了子は省略しています。この例では、リクエスト内の文が正常に完了したと仮定しています。
DECLARE curs CURSOR FOR ’SELECT ent1,ent2,ent3 FROM tabx; UPDATE ...;SELECT entt FROM tabl’ OPEN curs {SQLCA gets first SELECT result} WHENEVER NOT FOUND GOTO updstmt selstmt1: FETCH curs INTO :vara,:varb,:varc . . GOTO selstmt1 updstmt: WHENEVER NOT FOUND CONTINUE POSITION curs TO STATEMENT 2 {SQLCA gets UPDATE result} FETCH curs . . WHENEVER NOT FOUND GOTO reread POSITION curs TO STATEMENT 3 {SQLCA gets second SELECT result} selstmt2: FETCH curs INTO :vars . . GOTO selstmt2 reread: REWIND curs {SQLCA gets first SELECT result} WHENEVER NOT FOUND GOTO alldone selstmt1x: FETCH curs INTO :varaa,:varbb,:varcc . . GOTO selstmt1x alldone: CLOSE curs
関連情報
- 埋め込みSQLの関連トピックについては、SQLカーソル、結果コード変数、クライアント-サーバー接続文、または埋め込みSQLを使用したマルチセッション プログラミングの各セクションを参照してください。
- PREPAREおよびDESCRIBEについては、COMMENT (戻り形式)とPREPARE (動的)を参照してください。
- 複文リクエストでのカーソルの使用については、DECLARE CURSORを参照してください。