DECLARE (Snowflake Scripting)¶
声明一个或多个 Snowflake Scripting 变量、游标、RESULTSETs、嵌套存储过程或异常。
有关详细信息,请参阅以下主题:
- 另请参阅:
语法¶
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> };
...
]
以下各节更详细地描述了每种声明类型的语法:
变量声明语法¶
使用以下语法声明 变量:
<variable_declaration> ::=
<variable_name> [<type>] [ { DEFAULT | := } <expression>]
其中:
例如:
profit NUMBER(38, 2) := 0;
有关完整示例,请参阅 示例。
有关变量的更多信息,请参阅 使用变量。
光标声明语法¶
使用以下语法声明 游标:
<cursor_declaration> ::=
<cursor_name> CURSOR FOR <query>
其中:
cursor_name
为光标赋予的名称。这可以是该区块中尚未使用的任何有效 Snowflake 标识符。该标识符由其他与光标相关的命令使用,例如
FETCH
。query
定义光标遍历的结果集的查询。
这几乎可以是任何有效的 SELECT 语句。要在 SELECT 语句中指定绑定参数,请使用问号 (
?
)。在打开游标时,可以将参数绑定到 USING 子句中的绑定变量。
例如:
c1 CURSOR FOR SELECT id, price FROM invoices;
有关光标的更多信息(包括完整示例),请参阅 使用游标。
RESULTSET 声明语法¶
使用以下语法声明 RESULTSET。
<resultset_name> RESULTSET [ { DEFAULT | := } [ ASYNC ] ( <query> ) ] ;
其中:
例如:
res RESULTSET DEFAULT (SELECT col1 FROM mytable ORDER BY col1);
有关 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>
其中:
nested_procedure_name
嵌套存储过程的名称。名称必须遵循 对象标识符 的命名规则。
( [ arg_name arg_data_type ] [ , ... ] )
为嵌套存储过程指定输入参数。
对于
arg_name
,请指定输入实参的名称。对于
arg_data_type
,指定 一个 SQL 数据类型。
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)
否则(例如,如果您在运行时确定列类型),则可以省略列名称和类型:
RETURNS TABLE ()
备注
目前,在
RETURNS TABLE(...)
子句中,您无法指定 GEOGRAPHY 作为列类型。这在创建存储过程和匿名过程中均适用。CREATE OR REPLACE PROCEDURE test_return_geography_table_1() RETURNS TABLE(g GEOGRAPHY) ...
WITH test_return_geography_table_1() AS PROCEDURE RETURNS TABLE(g GEOGRAPHY) ... CALL test_return_geography_table_1();
如果尝试指定 GEOGRAPHY 为列类型,则调用存储过程会导致该错误:
Stored procedure execution error: data type of returned table does not match expected returned table type
要解决这个问题,可以省略
RETURNS TABLE()
中的列实参和类型。CREATE OR REPLACE PROCEDURE test_return_geography_table_1() RETURNS TABLE() ...
WITH test_return_geography_table_1() AS PROCEDURE RETURNS TABLE() ... CALL test_return_geography_table_1();
AS nested_procedure_definition
定义由嵌套存储过程所执行的代码。该定义可以包含任何有效的代码。
异常声明语法¶
使用以下语法声明 异常:
<exception_name> EXCEPTION [ ( <exception_number> , '<exception_message>' ) ] ;
其中:
exception_name
赋予异常的名称。
exception_number
用于唯一标识异常的数字。该数字必须是介于 -20000 和 -20999 之间的整数。该数字不应用于同时存在的任何其他例外情况。
默认值:-20000
exception_message
描述异常的消息。消息不得包含任何双引号字符。
默认值:空字符串。
例如:
exception_could_not_create_table EXCEPTION (-20003, 'ERROR: Could not create table.');
有关异常的更多信息(包括完整示例),请参阅 处理异常。
示例¶
此示例声明了名为 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;
注意:如果您在 Python Connector 代码中使用 Snowflake CLI、SnowSQL、Classic Console 或者 execute_stream
或 execute_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;
$$
;
有关声明变量、游标、RESULTSETs 和异常的更多示例,请参阅以下主题: