RESULTSETs の操作¶
このトピックでは、Snowflakeスクリプトで RESULTSET を使用する方法について説明します。
概要¶
Snowflakeスクリプトでは、 RESULTSET はクエリの結果セットをポイントする SQL データ型です。
RESULTSET は結果への単なるポインターであるため、 RESULTSET を介して結果にアクセスするには、次のいずれかを実行する必要があります。
TABLE(...)構文を使用して、結果をテーブルとして取得します。カーソル を使用して RESULTSET を反復処理します。
これらの両方の例を以下に示します。
カーソルと RESULTSET の違いを理解する¶
RESULTSET と カーソル はどちらも、クエリの結果セットへのアクセスを提供します。ただし、これらのオブジェクトは次の点で異なります。
クエリが実行された時点。
カーソルの場合、カーソルに対して OPEN コマンドを実行すると、クエリが実行されます。
RESULTSET の場合は、クエリを RESULTSET に割り当てるとクエリが実行されます(DECLARE セクション内または BEGIN ... END ブロック内のいずれか)。
OPEN コマンドでのバインドのサポート。
カーソルを宣言するときに、バインドパラメーター(
?文字)を指定できます。後で OPEN コマンドを実行すると、 USING 句で変数をそれらのパラメーターにバインドできます。RESULTSET は、 OPEN コマンドをサポートしていません。ただし、結果セットを返す前に、 SQL コマンドで変数をバインドできます。
一般に、クエリの結果セットを含むテーブルを返す場合は、 RESULTSET を使用する方が簡単です。ただし、カーソルを使用してSnowflakeスクリプトブロックからテーブルを返すこともできます。そのためには、カーソルを RESULTSET_FROM_CURSOR(cursor) に渡して RESULTSET を返し、その RESULTSET を TABLE(...) に渡します。カーソルのテーブルを返す をご参照ください。
RESULTSET の宣言¶
ブロックの DECLARE セクションまたはブロックの BEGIN ... END セクションで RESULTSET を宣言できます。
DECLARE セクション内において、 RESULTSET 宣言構文 で説明されている構文を使用します。例:
BEGIN ... END ブロック内において、 RESULTSET 割り当て構文 で説明されている構文を使用します。例:
宣言された RESULTSET へのクエリの割り当て¶
すでに宣言されている RESULTSET にクエリの結果を割り当てるには、次の構文を使用します。
条件:
クエリを RESULTSET に割り当てる方法:
クエリを RESULTSET に割り当て、非同期の子ジョブとしてクエリを実行する方法:
クエリ用に SQL 文字列を動的に構築するには、 query を (EXECUTE IMMEDIATE string_of_sql) にセットします。例:
RESULTSET に対して EXECUTE IMMEDIATE ステートメントに query をセットすることはできますが、カーソルに対してこれを行うことはできません。
RESULTSET の使用¶
RESULTSET のクエリは、オブジェクトがそのクエリに関連付けられているときに実行されます。例:
RESULTSET を宣言し、 DEFAULT 句をクエリに設定すると、その時点でクエリが実行されます。
:=演算子を使用してクエリを RESULTSET に割り当てると、その時点でクエリが実行されます。
注釈
RESULTSET はクエリの結果セットをポイントしているため(クエリの結果セットは含まれていません)、 RESULTSET はクエリ結果がキャッシュされている間(通常は24時間)のみ有効です。クエリ結果のキャッシュの詳細については、 保存済みのクエリ結果の使用 をご参照ください。
クエリが実行されると、カーソルを使用して結果にアクセスできます。ストアドプロシージャから結果をテーブルとして返すこともできます。
カーソルの使用による RESULTSET からのデータへのアクセス¶
カーソルを使用して RESULTSET からデータにアクセスするには、オブジェクト上で カーソルを宣言 します。例:
RESULTSET でカーソルを宣言すると、カーソルはすでに RESULTSET にあるデータにアクセスできます。カーソルで OPEN コマンドを実行しても、 RESULTSET のクエリは再度実行されません。
次に、 カーソルを開き、カーソルを使用して データをフェッチ します。
注釈
結果に GEOGRAPHY 値が含まれる場合は、 GEOGRAPHY 入力値を期待する関数に値を渡す前に、値を GEOGRAPHY 型にキャストする必要があります。カーソルの使用による GEOGRAPHY 値の取得 をご参照ください。
RESULTSET をテーブルとして返す¶
RESULTSET がポイントする結果を返す場合は、 RESULTSET を TABLE(...) に渡します。例:
これは、 TABLE(...) が テーブル関数 (RESULT_SCAN など)で使用される方法と似ています。
例に示すように、テーブルを返すストアドプロシージャを作成する場合は、テーブルを返すものとしてストアドプロシージャを宣言する必要があります。
注釈
現在、 TABLE(resultset_name) 構文は、 RETURN ステートメントでのみサポートされています。
カーソルを使用して RESULTSET から行をフェッチ した場合でも、 TABLE(resultset_name) によって返されるテーブルには、(カーソルの内部行ポインターから始まる行だけでなく)すべての行が含まれています。
RESULTSET データ型の制限¶
RESULTSET はデータ型ですが、Snowflakeはまだ以下をサポートしていません。
型 RESULTSET の列を宣言する。
型 RESULTSET のパラメーターを宣言する。
ストアドプロシージャの戻り型を RESULTSET として宣言する。
Snowflakeは、Snowflakeスクリプト内でのみ RESULTSET をサポートします。
また、 RESULTSET を直接テーブルとして使用することはできません。たとえば、次は無効です。
RESULTSET の使用例¶
次のセクションでは、 RESULTSET の使用例を示します。
RESULTSETs で指定されたクエリを非同期子ジョブとして実行するために ASYNC キーワードを使用する例については、 非同期子ジョブの使用例 を参照してください。
例に対するデータの設定¶
以下の例の多くでは、以下に示すテーブルとデータを使用しています。
例: ストアドプロシージャからテーブルを返す¶
次のコードは、 RESULTSET を宣言し、 RESULTSET がポイントする結果を返す方法を示しています。CREATE PROCEDURE コマンドの RETURNS 句は、ストアドプロシージャが INTEGER 型の1つの列を含むテーブルを返すことを宣言しています。
ブロック内の RETURN ステートメントは、 TABLE(...) 構文を使用して結果をテーブルとして返します。
ストアドプロシージャを作成します。
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
ストアドプロシージャを呼び出します。
:doc:` パイプ演算子 </sql-reference/operators-flow>`(->>)を使用して、ストアドプロシージャの呼び出しの結果を処理することができます。
RESULT_SCAN 関数を使用して、ストアドプロシージャ呼び出しの結果を処理することもできます。
例: SQL ステートメントを動的に作成する¶
SQL を動的に構築できます。以下は、前のストアドプロシージャと同じクエリを実行しますが、動的に構築される SQL ステートメントを使用する例です。
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
例を実行するには、ストアドプロシージャを呼び出し、テーブル名を渡します。
例: DEFAULT 句なしで RESULTSET 変数を宣言する¶
次のコードは、 DEFAULT 句なしで(つまり、クエリを RESULTSET に関連付けずに) RESULTSET を宣言し、後で RESULTSET をクエリに関連付ける方法を示しています。
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
例を実行するには、ストアドプロシージャを呼び出します。
例: CURSOR を RESULTSET で使用する¶
次のコードは、 カーソル を使用して RESULTSET の行を反復処理する方法を示しています。
ストアドプロシージャを作成します。
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
ストアドプロシージャを呼び出すと、結果にテーブル内の a の値が追加されます(1 + 2)。
RESULTSET を使用するその他の例¶
以下は RESULTSET を使った例です。
-
この例では、 RESULTSET を反復する FOR ループの使い方を示します。
-
この例では、 RESULTSET のデータテーブルを返すためにカーソルを使用する方法を示します。
-
この例では、ユーザー入力に基づいて変数をバインドしてテーブルのデータを更新する方法を示します。RESULTSET の行を繰り返し処理するために、条件ロジックを含む FOR ループを使用します。
-
この例では、 RESULTSET を使用してデータを収集し、そのデータをテーブルに挿入して過去の傾向を追跡する方法を示します。