埋め込みSQLでの複文リクエスト - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/xqq1557098602407.ditamap
dita:ditavalPath
ja-JP/xqq1557098602407.ditaval
dita:id
B035-1148
Product Category
Software
Teradata Vantage

カーソルを必要とする複文リクエスト

複文リクエストは、たびたび複数行の応答を返します。リクエスト内のそれぞれの文は、固有の結果を生成し(成功/失敗、アクティビティ カウントなど)、それらはアプリケーション プログラムに返されます。

複文リクエストの結果テーブルは複数の応答を返すので、結果を取り出して操作するカーソルを宣言することは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

関連トピック

以下に関する情報