DECLARE (Snowflakeスクリプト)

1つ以上のSnowflakeスクリプト変数、カーソル、RESULTSETs、ネストされたストアドプロシージャ、または例外を宣言します。

詳細については、次のトピックをご参照ください。

こちらもご参照ください:

LET

構文

DECLARE
  {   <variable_declaration>
    | <cursor_declaration>
    | <resultset_declaration>
    | <nested_stored_procedure_declaration>
    | <exception_declaration> };
  [
    {   <variable_declaration>
      | <cursor_declaration>
      | <resultset_declaration>
      | <nested_stored_procedure_declaration>
      | <exception_declaration> };
    ...
  ]
Copy

次のセクションでは、各タイプの宣言の構文について詳しく説明します。

変数宣言構文

次の構文を使用して、変数 を宣言します。

<variable_declaration> ::=
  <variable_name> [<type>] [ { DEFAULT | := } <expression>]
Copy

条件:

variable_name

変数の名前。名前は、 オブジェクト識別子 の名前付け規則に従う必要があります。

type

SQL データ型

DEFAULT expression または . := expression

expression の値を変数に割り当てます。typeexpression の両方が指定されている場合、式は一致するデータ型に評価される必要があります。または、式を指定した type に暗黙的に キャスト することができます。

例:

profit NUMBER(38, 2) := 0;
Copy

包括的な例については、 をご参照ください。

変数の詳細については、 変数の操作 をご参照ください。

カーソル宣言構文

次の構文を使用して、カーソル を宣言します。

<cursor_declaration> ::=
  <cursor_name> CURSOR FOR <query>
Copy

条件:

cursor_name

カーソルに付ける名前。これは、このブロックでまだ使用されていない有効なSnowflake 識別子 であればどれでもかまいません。識別子は、 FETCH などの他のカーソル関連コマンドで使用されます。

query

カーソルが反復する、結果セットを定義するクエリ。

これは、有効な SELECT ステートメントの大半に当てはまります。SELECT ステートメントでバインドパラメーターを指定するには、疑問符(?)を使用します。カーソルを開くときにパラメーターをバインドして、USING 句の変数をバインドできます。

例:

c1 CURSOR FOR SELECT id, price FROM invoices;
Copy

カーソル(包括的な例を含む)の詳細については、 カーソルの操作 をご参照ください。

RESULTSET 宣言構文

次の構文を使用して、RESULTSET を宣言します。

<resultset_name> RESULTSET [ { DEFAULT | := } [ ASYNC ] ( <query> ) ] ;
Copy

条件:

resultset_name

RESULTSET に付ける名前。

名前は、現在のスコープ内で一意である必要があります。

名前は、 オブジェクト識別子 の名前付け規則に従う必要があります。

ASYNC

クエリを 非同期の子ジョブ として実行します。

クエリには、 SELECT ステートメントや DML ステートメント(INSERT や UPDATE など)を含む、有効な SQL ステートメントを指定できます。

このキーワードを省略すると、ストアドプロシージャは子ジョブを順次実行し、各子ジョブは実行中の子ジョブの終了を待ってから開始します。

このキーワードを使用すると、複数の子ジョブを同時に実行できるため、効率が向上し、全体の実行時間が短縮されます。

AWAIT および CANCEL ステートメントを使用して、 RESULTSET の非同期の子ジョブを管理できます。

DEFAULT query または . := query

query の値を RESULTSET に割り当てます。

例:

res RESULTSET DEFAULT (SELECT col1 FROM mytable ORDER BY col1);
Copy

RESULTSETs (包括的な例を含む)の詳細については、 RESULTSETs の操作 をご参照ください。

ネストされたストアドプロシージャ宣言構文

次の構文を使用して、ネストされたストアドプロシージャ を宣言します。

<nested_procedure_name> PROCEDURE (
    [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS { <result_data_type> | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
  AS <nested_procedure_definition>
Copy

条件:

nested_procedure_name

ネストされたストアドプロシージャの名前。名前は、 オブジェクト識別子 の名前付け規則に従う必要があります。

( [ arg_name arg_data_type ] [ , ... ] )

ネストされたストアドプロシージャの入力引数を指定します。

  • arg_name には、入力引数の名前を指定します。

  • arg_data_type には、:doc:` SQL データ型 </sql-reference-data-types>` を指定します。

RETURNS { result_data_type | TABLE ( [ col_name col_data_type [ , ... ] ] ) }

ストアドプロシージャによって返される結果の型を指定します。現在、NOT NULL は、ネストされたストアドプロシージャの RETURNS パラメーターではサポートされていません。

  • RETURNS result_data_type には、:doc:` SQL データ型 </sql-reference-data-types>` を指定します。

  • 返されたテーブルの列の Snowflakeデータ型 がわかっている場合、 RETURNS TABLE ( [ col_name col_data_type [ , ... ] ] ) には、列名と型を指定します。

    RETURNS TABLE (sales_date DATE, quantity NUMBER)
    
    Copy

    それ以外の場合(例: 実行時に列型を決定する場合)は、列名と型を省略できます。

    RETURNS TABLE ()
    
    Copy

    注釈

    現在、 RETURNS TABLE(...) 句では、 GEOGRAPHY を列タイプとして指定することはできません。これは、ストアドプロシージャまたは匿名プロシージャを作成する場合に適用されます。

    CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
      RETURNS TABLE(g GEOGRAPHY)
      ...
    
    Copy
    WITH test_return_geography_table_1() AS PROCEDURE
      RETURNS TABLE(g GEOGRAPHY)
      ...
    CALL test_return_geography_table_1();
    
    Copy

    列タイプとして GEOGRAPHY を指定しようとすると、ストアドプロシージャの呼び出しはエラーになります。

    Stored procedure execution error: data type of returned table does not match expected returned table type
    
    Copy

    この問題を回避するには、 RETURNS TABLE() の列の引数と型を省略します。

    CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
      RETURNS TABLE()
      ...
    
    Copy
    WITH test_return_geography_table_1() AS PROCEDURE
      RETURNS TABLE()
      ...
    CALL test_return_geography_table_1();
    
    Copy
AS nested_procedure_definition

ネストされたストアドプロシージャによって実行されるコードを定義します。定義は、任意の有効なコードで構成できます。

例外宣言構文

次の構文を使用して、例外 を宣言します。

<exception_name> EXCEPTION [ ( <exception_number> , '<exception_message>' ) ] ;
Copy

条件:

exception_name

例外に付ける名前。

exception_number

例外を一意に識別するための番号。数値は-20000と-20999の間の整数でなければなりません。この番号は、同時に存在する他の例外には使用しないでください。

デフォルト: -20000

exception_message

例外を説明するメッセージ。メッセージには二重引用符を含めることはできません。

デフォルト: 空の文字列。

例:

exception_could_not_create_table EXCEPTION (-20003, 'ERROR: Could not create table.');
Copy

例外(包括的な例を含む)の詳細については、 処理の例外 をご参照ください。

この例では、Snowflake Scriptingの匿名ブロックで使用する profit という名前の変数を宣言します。

DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
Copy

注意:Snowflake CLISnowSQLClassic Consoleexecute_streamexecute_string メソッドを Python Connector コードで使用する場合は、代わりにこの例を使用してください(Snowflake CLI、 SnowSQL、 Classic Console、Python ConnectorでSnowflake Scriptingを使用する を参照)。

EXECUTE IMMEDIATE 
$$
DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
$$
;
Copy

変数、カーソル、RESULTSETs、例外を宣言する例については、以下のトピックをご参照ください。