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

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

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

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

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

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

  • DECLARE: ブロックで変数、カーソル、 RESULTSETs、または例外を使用する必要がある場合は、ブロックの 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;
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

注: SnowSQLClassic Consoleexecute_stream または execute_string メソッドを Python Connector コードで使用している場合は、代わりにこの例を使用してください(SnowSQL、 Classic Console、Python Connectorで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

CALL コマンドを使用して、ストアドプロシージャを呼び出すことができます。次の例では、前の例のストアドプロシージャ area を呼び出します。

CALL area();
Copy

ストアドプロシージャは次の出力を返します。

+--------------+
|         AREA |
|--------------|
| 28.274333882 |
+--------------+

匿名ブロックの使用

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

注: SnowSQLClassic Consoleexecute_stream または execute_string メソッドを Python Connector コードで使用している場合は、代わりにこの例を使用してください(SnowSQL、 Classic Console、Python ConnectorでSnowflakeスクリプトを使用する を参照)。

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

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

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

出力の列ヘッダーは anonymous block です。コードがストアドプロシージャで実行された場合、列ヘッダーはストアドプロシージャの名前になります。

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

BEGIN
  CREATE TABLE parent (ID INTEGER);
  CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
  RETURN 'Completed';
END;
Copy

注: SnowSQLClassic Consoleexecute_stream または execute_string メソッドを Python Connector コードで使用している場合は、代わりにこの例を使用してください(SnowSQL、 Classic Console、Python ConnectorでSnowflakeスクリプトを使用する を参照)。

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