目的
呼び出されているプログラムの実行を一時停止し、1つまたは複数の非同期SQL文が完了するのを待ちます。
呼び出し
実行可能形式。
埋め込みSQLのみ。
構文
- async_statement_identifier
- ASYNC修飾子によって割り当てられた、非同期で実行されるSQL文の、大文字小文字を区別するアプリケーション提供の識別子。
- async_statement_identifier_variable_name
- WAIT文に渡される非同期文識別子を備えたホスト変数の名前。
- ALL
- 現在の非同期実行SQL文すべての実行を一時停止します。
- async_statement_variable
- リクエストが完了した非同期文の識別子が入るホスト変数の名前。
- session_variable
- 完了したasync_statement_variableのセッション識別子が書き込まれるホスト変数の名前。
ANSI準拠
WAITは、ANSI/ISO SQL:2011規格に対するTeradataの拡張機能です。
許可
なし。
ルール
それぞれのasync_statement_identifier(最大30バイトまで)は全てのアクティブな接続の間で固有でなければならず、大文字と小文字を区別します。
- SQLCODEは -650に設定される。
- SQLSTATEは’04000’に設定される。
| 指定するオプション | WAIT文が結果を返す時点 |
|---|---|
| ALL | すべての非同期文の終了時。 |
| ANY COMPLETION INTO | 未解決の非同期文の終了時。 非同期文の識別子はINTO句のホスト変数async_statement_variableに返され、セッション識別子はホスト変数session_variableに返されます。 ホスト変数async_statement_variableおよびsession_variableは固定長または可変長の文字変数で、最大長が30バイトでなければなりません。 返される非同期文識別子が出力ホスト変数に定義された長さよりも長い場合、例外条件“output host variable is too small to hold returned data”が発生します。
|
- DECLARE CURSOR文によって指定されるカーソル リクエスト。
- PREPAREまたはEXECUTE IMMEDIATE文で指定された動的リクエスト。
例1 - 4
以下のRDTINフィールドは、以下のWAIT文の例において重要です。
| RDTINフィールド | 必須の指定 |
|---|---|
| RdtCType | 470に設定。 |
| RdtAux1 | 次の値のいずれかに設定。
|
| RdtVersn | 10に設定。 |
| RdtExt | ’Y’に設定。非同期文を指定した場合にのみ、拡張機能領域の存在を示す。 |
| RdtXTotL | RDTXASYN拡張機能領域のサイズを含む。非同期文を指定した場合のみ。 |
さらに、非同期文を指定した場合、RdtX008 (RDTXASYN)構造は接続名と通信するので、拡張機能領域のいずれかを組み込む必要があります。
例: 固定長の文字値をホスト変数に渡す
この例では、固定長の文字値を、ANY COMPLETION INTO句内の文およびセッション変数に対して宣言されたホスト変数に渡します。
EXEC SQL WAIT ANY COMPLETION INTO :STMTNAMF, :CONNAMEF;
例1でC Preprocessor2によって生成される行
{
static struct {
char sqldaid[8];
SQLInt32 sqldabc;
short sqln;
short sqld;
struct {
short sqltype;
short sqllen;
char *sqldata;
char *sqlind;
struct {
short length;
char data[30];
} sqlname;
} sqlvar[2];
} Sql_DA019_StructO =
{'S','Q','L','D','A',' ',' ',' ',104,2,2,{{460,31,0,0,{0,{' '}}}
,{460,31,0,0,{0,{' '}}}}};
Sql_DA019_StructO.sqlvar[0].sqldata = STMTNAMF;
Sql_DA019_StructO.sqlvar[1].sqldata = CONNAMEF;
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char RdtUserid[8];
SQLInt32 RdtEntty;
char *RdtCA;
char *RdtDAIn;
char *RdtDAOut;
char *RdtSql;
char *RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char RdtLCS;
char RdtComit;
char RdtRelse;
char RdtExt;
char RdtSepBT;
char RdtUCStm;
char RdtCmpat;
char RdtComp;
SQLInt16 RdtXTotL;
char RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
} RDTIN019 =
{470,10,0,{' '},0,0,0,0,0,0,2,0,'N','B','N','Y','N','N',
' ','C',12,{' '},{8,5,255}};
RDTIN019.RdtDAOut = (char *)(&Sql_DA019_StructO);
RDTIN019.RdtCA = (char *)(&sqlca);
RDTIN019.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN019);
SQL_RDTRTCON = RDTIN019.RdtRtCon;
}
}
例2
この例では、可変長の文字値を、ANY COMPLETION INTO句内の文およびセッション変数に対して宣言されたホスト変数に渡します。
EXEC SQL WAIT ANY COMPLETION INTO :STMTNAMV, :CONNAMEV;
例2でC Preprocessor2によって生成される行
{
static struct {
char sqldaid[8];
SQLInt32 sqldabc;
short sqln;
short sqld;
struct {
short sqltype;
short sqllen;
char *sqldata;
char *sqlind;
struct {
short length;
char data[30];
} sqlname;
} sqlvar[2];
} Sql_DA020_StructO =
{'S','Q','L','D','A',' ',' ',' ',104,2,2,{{448,30,0,0,{0,{' '}}}
,{448,30,0,0,{0,{' '}}}}};
Sql_DA020_StructO.sqlvar[0].sqldata = (char *)(&STMTNAMV);
Sql_DA020_StructO.sqlvar[1].sqldata = (char *)(&CONNAMEV);
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char RdtUserid[8];
SQLInt32 RdtEntty;
char *RdtCA;
char *RdtDAIn;
char *RdtDAOut;
char *RdtSql;
char *RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char RdtLCS;
char RdtComit;
char RdtRelse;
char RdtExt;
char RdtSepBT;
char RdtUCStm;
char RdtCmpat;
char RdtComp;
SQLInt16 RdtXTotL;
char RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
} RDTIN020 =
{470,10,0,{' '},0,0,0,0,0,0,2,0,'N','B','N','Y','N','N',
' ','C',12,{' '},{8,5,255}};
RDTIN020.RdtDAOut = (char *)(&Sql_DA020_StructO);
RDTIN020.RdtCA = (char *)(&sqlca);
RDTIN020.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN020);
SQL_RDTRTCON = RDTIN020.RdtRtCon;
}
}
例3
この例では、ALL COMPLETIONオプションを使用して、すべてのアクティブな非同期文が完了するまで待機します。
EXEC SQL WAIT ALL COMPLETION;
例3でC Preprocessor2によって生成される行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char RdtUserid[8];
SQLInt32 RdtEntty;
char *RdtCA;
char *RdtDAIn;
char *RdtDAOut;
char *RdtSql;
char *RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char RdtLCS;
char RdtComit;
char RdtRelse;
char RdtExt;
char RdtSepBT;
char RdtUCStm;
char RdtCmpat;
char RdtComp;
SQLInt16 RdtXTotL;
char RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
} RDTIN021 =
{470,10,0,{' '},0,0,0,0,0,0,1,0,'N','B','N','Y','N','N',' ','C',
12,{' '},{8,5,255}};
RDTIN021.RdtCA = (char *)(&sqlca);
RDTIN021.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN021);
SQL_RDTRTCON = RDTIN021.RdtRtCon;
}
例4
この例では、複数の明示的な非同期文を使用します。
EXEC SQL WAIT ASYNSTMT1, ASYNSTMT2 COMPLETION;
例4でC Preprocessor2によって生成される行
{
static struct {
SQLInt32 RdtCType;
SQLInt16 RdtVersn;
SQLInt16 RdtDec;
char RdtUserid[8];
SQLInt32 RdtEntty;
char *RdtCA;
char *RdtDAIn;
char *RdtDAOut;
char *RdtSql;
char *RdtRtCon;
SQLInt32 RdtAux1;
SQLInt32 RdtAux2;
char RdtLCS;
char RdtComit;
char RdtRelse;
char RdtExt;
char RdtSepBT;
char RdtUCStm;
char RdtCmpat;
char RdtComp;
SQLInt16 RdtXTotL;
char RdtXFill[2];
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXCode;
} RdtX005;
struct {
SQLInt16 RdtXLen;
SQLInt16 RdtXType;
SQLInt32 RdtXAsyC;
struct {
SQLInt16 RdtXAsyL;
char RdtXAsyT[30];
} RdtXAsyS[2];
} RdtX008;
} RDTIN022 =
{470,10,0,{' '},0,0,0,0,0,0,3,0,'N','B','N','Y','N','N',' ','C',
84,{' '},{8,5,255},{72,8,2,{{9,'A','S','Y','N','S','T','M','T',
'1',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' ',' '},{9,'A','S','Y','N','S','T','M','T','2',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' '}}}};
RDTIN022.RdtCA = (char *)(&sqlca);
RDTIN022.RdtRtCon = SQL_RDTRTCON;
TDARDI(&RDTIN022);
SQL_RDTRTCON = RDTIN022.RdtRtCon;
}
例1 -4
以下の例は、クライアント プログラミング コードのコンテキストがないWAIT文のSQLテキストを表わしています。
例: 基本的なWAIT文
以下の例は、基本的なWAIT文を示しています。req_1というSQLリクエストが完了すると、WAITはプログラムに制御を戻します。
WAIT req_1 COMPLETION
例: より複雑なWAIT文
以下の例はより複雑なWAIT文で、非同期文の識別子を2つ指定します。req_1およびreq_2の両方が完了した時点で、WAITはプログラムに制御を戻します。
WAIT req_1, req_2 COMPLETION
例: 未処理の非同期SQL文
以下の例では、全ての未処理の非同期SQL文の完了を待機して、全てが完了した時点でプログラムに制御を戻します。
WAIT ALL COMPLETION
例: 未処理の非同期SQL文の完了
以下の例では、いずれかの未処理の非同期SQLリクエストが完了するの待機し、いずれかが完了するとプログラムに制御を戻します。このとき、完了した非同期文の識別子を:requid_varに、リクエストが完了したセッションの識別子を:sessid_varにそれぞれ返します。
WAIT COMPLETION INTO :reqid_var, :sessid_var