単一リクエストによる複数の SQL ステートメントの送信¶
このトピックでは、複数のステートメントを含むリクエストをSnowflake SQL API に送信する方法について説明します。
注釈
1つのクエリで複数のステートメントを実行するには、有効なウェアハウスがセッションで利用可能である必要があります。
概要¶
場合によっては、リクエストで複数の SQL ステートメントを指定する必要があります。たとえば、次が必要になる場合があります。
明示的なトランザクションを定義する
リクエストのステートメントでセッション変数を設定して使用する
リクエストのステートメントで仮テーブルを作成して使用する
リクエスト内のステートメントのデータベース、スキーマ、ウェアハウス、またはロールを変更する
次のセクションでは、複数の SQL ステートメントを含むリクエストを送信する方法について説明します。
リクエストでの複数の SQL ステートメントの指定¶
単一リクエストで複数の SQL ステートメントを送信するには、
statementフィールドで、各ステートメントの間にセミコロン(;)を使用します。parametersフィールドで、MULTI_STATEMENT_COUNTフィールドをリクエスト内の SQL ステートメントの数に設定します。
例:
この例では、 MULTI_STATEMENT_COUNT は 2 に設定されています。これは、送信される SQL ステートメントの数に対応します。
statement フィールドに可変数の SQL ステートメントを送信するには、 MULTI_STATEMENT_COUNT を 0 に設定します。これは、送信された SQL ステートメントの数が実行時にわからないアプリケーションで役立ちます。
MULTI_STATEMENT_COUNT の値が statement フィールドで指定された SQL ステートメントの数と一致しない場合、 SQL API は次のエラーを返します。
条件
actual_countは、statementフィールドで指定されたステートメントの数です。desired_countはMULTI_STATEMENT_COUNTの値です。
statement フィールドに複数の SQL ステートメントを指定したが、 MULTI_STATEMENT_COUNT フィールドを指定しなかった場合、 SQL API は次のエラーを返します。
注釈
Snowflakeは現在、マルチステートメント SQL リクエストでの変数バインドをサポートしていません。
リクエストでの各 SQL ステートメントの結果の取得¶
複数の SQL ステートメントを含むリクエストが正常に処理された場合、応答には個々のステートメントの実行から返されたデータは含まれません。代わりに、応答には、個別ステートメントのハンドルの配列を含む statementHandles フィールドが含まれています。
注釈
statementHandles フィールドは statementHandle フィールドとは異なります。
statementHandleフィールドは、リクエストにある SQL のセットに対するステートメントのハンドルを指定します。statementHandlesフィールドは、リクエストにある個別 SQL ステートメントのハンドルの配列です。
たとえば、実行のために2つの SQL ステートメントを指定するリクエストを送信するとします。
応答には、個別ステートメントのハンドルの配列を含む statementHandles フィールドが含まれています。
ステータスを確認して個々のステートメントのデータを取得するには、 GET リクエストを /api/v2/statements/ エンドポイントに送信し、各ステートメントのハンドルを URL パスに追加します。詳細については ステートメントの実行ステータスの確認およびデータの取得 をご参照ください。
リクエストで複数のステートメントを指定する際のエラーの処理¶
リクエストで複数の SQL ステートメントを指定し、いずれかのステートメントの実行中にエラーが発生した場合、Snowflakeは QueryFailureStatus オブジェクトを含む HTTP 応答コード422を返します。
このオブジェクトから、 エラーに関する詳細 を取得できます。
たとえば、リクエストで次のステートメントが指定されていて、2番目の INSERT ステートメントにエラーが含まれているとします。
Snowflakeは、 HTTP 応答コード422と、エラーに関する詳細を含む QueryFailureStatus オブジェクトのある応答を返します。
上記の例では、エラーのある INSERT ステートメントは、 statement フィールドの 値 の文字位置75から始まります。
エラーのあるステートメントの前のステートメントは正常に実行されます(この例では CREATE TABLE および最初の INSERT ステートメント)。エラーのあるステートメントの後のステートメントは実行されません。