Snowflakeスクリプトのブロックを理解する¶
Snowflakeスクリプトでは、Snowflakeスクリプトのブロック内に手続き型コードを記述します。このトピックでは、手続き型コードをブロックに記述する方法について説明します。
このトピックの内容:
ブロックの構造を理解する¶
ブロックの基本構造は次のとおりです。
DECLARE
... (variable declarations, cursor declarations, etc.) ...
BEGIN
... (Snowflake Scripting and SQL statements) ...
EXCEPTION
... (statements for handling exceptions) ...
END;
ブロックは、キーワードで区切られたセクション(一部はオプション)で構成されます。各セクションは異なる目的を果たします。
DECLARE: ブロックで変数やカーソルなどを使用する必要がある場合は、ブロックの
DECLARE
セクションまたはブロックのBEGIN ... END
セクションで、これらを宣言できます。次のように宣言できます。
ブロックのこのセクションはオプションです。
BEGIN ... END:
BEGIN
とEND
の間におけるブロックのセクションに、 SQL ステートメントとSnowflakeスクリプト構造を記述します。EXCEPTION: 例外処理コードを追加する必要がある場合は、これをブロックの
EXCEPTION
セクションに追加します。ブロックのこのセクションはオプションです。
単純なブロックには、キーワード BEGIN
と END
が必要です。例:
BEGIN
CREATE TABLE employee (id INTEGER, ...);
CREATE TABLE dependents (id INTEGER, ...);
END;
重要
ブロックを開始するキーワード BEGIN
は、トランザクションを開始するキーワード BEGIN
とは異なります。混乱を最小限に抑えるために、Snowflakeは、単なる BEGIN
ではなく、 BEGIN TRANSACTION
(または古い形式の BEGIN WORK
)でトランザクションを開始することを強くお勧めします。
ブロック内に作成したデータベースオブジェクト(例: 上記の例のテーブル)は、ブロック外で使用できます。
コードで変数を使用している場合は、ブロック内で それらの変数を宣言する ことができます。これを実行する1つの方法は、ブロックの DECLARE セクションにあります。例:
DECLARE
radius_of_circle FLOAT;
area_of_circle FLOAT;
BEGIN
radius_of_circle := 3;
area_of_circle := pi() * radius_of_circle * radius_of_circle;
RETURN area_of_circle;
END;
この例では、変数を宣言し、変数を使用して、変数の値を返します。(ブロックから値が返される方法の詳細については、 値を返す をご参照ください。)
これらの変数は、ブロック外では使用できないことに注意してください。 宣言の範囲を理解する をご参照ください。
LET を使用して、ブロックの BEGIN ... END
セクションで変数を宣言することもできます。詳細については、 変数の宣言 をご参照ください。
ストアドプロシージャでのブロックの使用¶
ストアドプロシージャの定義でブロックを使用できます。 Snowsight で実行して、Snowflakeスクリプトのブロックを含むストアドプロシージャを作成できる例を次に示します。
CREATE OR REPLACE PROCEDURE area()
RETURNS FLOAT
LANGUAGE SQL
AS
DECLARE
radius FLOAT;
area_of_circle FLOAT;
BEGIN
radius := 3;
area_of_circle := PI() * radius * radius;
RETURN area_of_circle;
END;
SnowSQL または Classic Console を使用している場合は、 SnowSQL および Classic Console でのSnowflakeスクリプトの使用 で説明されているように、ブロックを区切るために一重引用符または二重ドル記号を使用する必要があることに注意してください。
CREATE OR REPLACE PROCEDURE area()
RETURNS FLOAT
LANGUAGE SQL
AS
$$
DECLARE
radius FLOAT;
area_of_circle FLOAT;
BEGIN
radius := 3;
area_of_circle := PI() * radius * radius;
RETURN area_of_circle;
END;
$$
;
匿名ブロックの使用¶
データベースのストアドプロシージャにブロックを格納しない場合は、 匿名ブロック を定義して使用できます。匿名ブロックは、ストアドプロシージャの一部ではないブロックです。ブロックを個別のスタンドアロン SQL ステートメントとして定義します。
ブロックを定義する BEGIN ステートメントもブロックを実行します。(ブロックを実行するために別の CALL
コマンドを実行することはありません。)
Snowsight で実行できる匿名ブロックの例を次に示します。
DECLARE radius_of_circle FLOAT; area_of_circle FLOAT; BEGIN radius_of_circle := 3; area_of_circle := PI() * radius_of_circle * radius_of_circle; RETURN area_of_circle; END;
この例では、次の出力が生成されます。
+-----------------+ | anonymous block | |-----------------| | 28.274333882 | +-----------------+
SnowSQL または Classic Console を使用している場合は、ブロックを文字列リテラル(一重引用符または二重ドル記号で区切る)として指定し、 SnowSQL および Classic Console でのSnowflakeスクリプトの使用 で説明されているように、ブロックを EXECUTE IMMEDIATE に渡す必要があることに注意してください。
EXECUTE IMMEDIATE $$ DECLARE radius_of_circle FLOAT; area_of_circle FLOAT; BEGIN radius_of_circle := 3; area_of_circle := PI() * radius_of_circle * radius_of_circle; RETURN area_of_circle; END; $$ ; +-----------------+ | anonymous block | |-----------------| | 28.274333882 | +-----------------+
出力の列ヘッダーは「匿名ブロック」であることに注意してください。コードがストアドプロシージャで実行された場合、列ヘッダーはストアドプロシージャの名前になります。
次の例では、関連する2つのテーブルを作成する匿名ブロックを定義します。この例では、手続き型コードのブロックは変数を使用する必要がないため、ブロックの DECLARE
セクションは省略されています。
BEGIN CREATE TABLE parent (ID INTEGER); CREATE TABLE child (ID INTEGER, parent_ID INTEGER); RETURN 'Completed'; END;+-----------------+ | anonymous block | |-----------------| | Completed | +-----------------+注: SnowSQL または Classic Console を使用している場合は、代わりに次の例を使用します(SnowSQL および Classic Console でのSnowflakeスクリプトの使用 を参照)。
EXECUTE IMMEDIATE $$ BEGIN CREATE TABLE parent (ID INTEGER); CREATE TABLE child (ID INTEGER, parent_ID INTEGER); RETURN 'Completed'; END; $$ ; +-----------------+ | anonymous block | |-----------------| | Completed | +-----------------+