DECLARE (Snowflake Scripting)

声明一个或多个 Snowflake Scripting 变量、游标、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

作为 异步子作业 来运行查询。

查询可以是任何有效的 SQL 语句,包括 SELECT 语句和 DML 语句,例如 INSERT 或 UPDATE。

当省略此关键字时,存储过程将按顺序运行子作业,每个子作业都要等待正在运行的子作业完成后才能开始。

您可以使用此关键字并发运行多个子作业,这样可以提高效率并减少总体运行时间。

您可以使用 AWAITCANCEL 语句管理 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 ] [ , ... ] )

为嵌套存储过程指定输入参数。

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

指定存储过程返回的结果的类型。目前,嵌套存储过程的 RETURNS 参数中不支持 NOT NULL。

  • 对于 RETURNS result_data_type,指定 一个 SQL 数据类型

  • 对于 RETURNS TABLE ( [ col_name col_data_type [ , ... ] ] ),如果知道返回表中各列的 Snowflake 数据类型,请指定列名称和类型:

    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

有关异常的更多信息(包括完整示例),请参阅 处理异常

示例

此示例声明了名为 profit 的变量,用于 Snowflake Scripting 匿名块:

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

注意:如果您在 Python Connector 代码中使用 Snowflake CLISnowSQLClassic Console 或者 execute_streamexecute_string 方法,请改用本示例(请参阅 在 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 和异常的更多示例,请参阅以下主题:

语言: 中文