Snowflakeスクリプトのブロックを理解する

Snowflakeスクリプトでは、Snowflakeスクリプトのブロック内に手続き型コードを記述します。このトピックでは、手続き型コードをブロックに記述する方法について説明します。

このトピックの内容:

ブロックの構造を理解する

ブロックの基本構造は次のとおりです。

DECLARE
  ... (variable declarations, cursor declarations, etc.) ...
BEGIN
  ... (Snowflake Scripting and SQL statements) ...
EXCEPTION
  ... (statements for handling exceptions) ...
END;
Copy

ブロックは、キーワードで区切られたセクション(一部はオプション)で構成されます。各セクションは異なる目的を果たします。

  • DECLARE: ブロックで変数やカーソルなどを使用する必要がある場合は、ブロックの DECLARE セクションまたはブロックの BEGIN ... END セクションで、これらを宣言できます。

    次のように宣言できます。

    ブロックのこのセクションはオプションです。

  • BEGIN ... END: BEGINEND の間におけるブロックのセクションに、 SQL ステートメントとSnowflakeスクリプト構造を記述します。

  • EXCEPTION: 例外処理コードを追加する必要がある場合は、これをブロックの EXCEPTION セクションに追加します。

    ブロックのこのセクションはオプションです。

単純なブロックには、キーワード BEGINEND が必要です。例:

BEGIN
    CREATE TABLE employee (id INTEGER, ...);
    CREATE TABLE dependents (id INTEGER, ...);
END;
Copy

重要

ブロックを開始するキーワード 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;
Copy

この例では、変数を宣言し、変数を使用して、変数の値を返します。(ブロックから値が返される方法の詳細については、 値を返す をご参照ください。)

これらの変数は、ブロック外では使用できないことに注意してください。 宣言の範囲を理解する をご参照ください。

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;
Copy

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;
$$
;
Copy

匿名ブロックの使用

データベースのストアドプロシージャにブロックを格納しない場合は、 匿名ブロック を定義して使用できます。匿名ブロックは、ストアドプロシージャの一部ではないブロックです。ブロックを個別のスタンドアロン 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;
Copy

この例では、次の出力が生成されます。

+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+
Copy

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 |
+-----------------+
Copy

出力の列ヘッダーは「匿名ブロック」であることに注意してください。コードがストアドプロシージャで実行された場合、列ヘッダーはストアドプロシージャの名前になります。

次の例では、関連する2つのテーブルを作成する匿名ブロックを定義します。この例では、手続き型コードのブロックは変数を使用する必要がないため、ブロックの DECLARE セクションは省略されています。

BEGIN
  CREATE TABLE parent (ID INTEGER);
  CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
  RETURN 'Completed';
END;
Copy
+-----------------+
| anonymous block |
|-----------------|
| Completed       |
+-----------------+
Copy

注: 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       |
+-----------------+
Copy