了解 Snowflake Scripting 中的块¶
在 Snowflake Scripting 中,您可在 Snowflake Scripting 块中编写过程代码。本主题介绍了如何在块中编写过程代码。
了解块的结构¶
块具有以下基本结构:
DECLARE
-- (variable declarations, cursor declarations, etc.) ...
BEGIN
-- (Snowflake Scripting and SQL statements) ...
EXCEPTION
-- (statements for handling exceptions) ...
END;
块由必填部分和可选部分组成,这些部分由关键字分隔。每个部分都有不同的用途:
DECLARE:如果需要在块中使用任何变量、游标、RESULTSETs 或异常等,可在块的 DECLARE 部分或 BEGIN ...END 部分中声明。
您可以声明:
块中的这一部分是可选的。
BEGIN ...END:在块的 BEGIN 和 END 之间的部分中编写 SQL 语句和 Snowflake Scripting 构造。
EXCEPTION:如果需要添加异常处理代码,请将其添加到块的 EXCEPTION 部分。
块中的这一部分是可选的。
一个简单的块只需要关键字 BEGIN 和 END。例如:
BEGIN
CREATE TABLE employee (id INTEGER, ...);
CREATE TABLE dependents (id INTEGER, ...);
END;
重要
启动块的关键字 BEGIN 与启动事务的关键字 BEGIN 不同。为了尽量减少混淆,Snowflake 强烈建议使用 BEGIN TRANSACTION(或旧形式 BEGIN WORK)来启动事务,而不是使用 BEGIN。
您在块中创建的任何数据库对象(例如,上面示例中的表)都可以在块之外使用。
如果代码中使用了变量,则可以在块中 声明这些变量。一种方法是在块的 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;
此示例声明了一个变量,使用该变量,并返回该变量的值。有关如何从块中返回值的详细信息,请参阅 返回值。
这些变量不能在块之外使用。请参阅 了解声明的范围。
在存储过程中使用块¶
可以在存储过程的定义中使用块。以下是一个示例,您可以在 Snowsight 中运行,创建一个包含 Snowflake Scripting 块的存储过程:
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;
注意:如果您在 Python Connector 代码中使用 Snowflake CLI、SnowSQL、Classic Console 或者 execute_stream
或 execute_string
方法,请改用本示例(请参阅 在 Snowflake CLI、SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):
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;
$$
;
可使用 CALL 命令调用存储过程。以下示例调用前一示例中的存储过程 area
:
CALL area();
存储过程返回以下输出:
+--------------+
| AREA |
|--------------|
| 28.274333882 |
+--------------+
有关更多信息,请参阅 使用 Snowflake Scripting 编写存储过程。
Using a block in a user-defined function (UDF)¶
You can use a block in the definition of a Snowflake Scripting UDF. The following example shows code that you can run in Snowsight to create a UDF that contains a Snowflake Scripting block:
CREATE OR REPLACE FUNCTION 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;
注意:如果您在 Python Connector 代码中使用 Snowflake CLI、SnowSQL、Classic Console 或者 execute_stream
或 execute_string
方法,请改用本示例(请参阅 在 Snowflake CLI、SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):
CREATE OR REPLACE FUNCTION 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;
$$;
可以在 SQL 语句中调用该函数,例如 SELECT 或 INSERT 语句。以下示例在 SELECT 语句中调用了前一个示例中的 Snowflake Scripting UDF area
:
SELECT area();
+--------------+
| AREA() |
|--------------|
| 28.274333882 |
+--------------+
For more information, see Snowflake Scripting UDFs.
使用匿名块¶
If you want to run procedural code outside of a stored procedure or UDF, you can define and use an anonymous block. An anonymous block is a block that is not part of a stored procedure or UDF. You define the block as a separate, standalone SQL statement.
定义块的 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;
注意:如果您在 Python Connector 代码中使用 Snowflake CLI、SnowSQL、Classic Console 或者 execute_stream
或 execute_string
方法,请改用本示例(请参阅 在 Snowflake CLI、SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):
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 |
+-----------------+
输出中的列标题是 anonymous block
;如果代码是在存储过程中执行,则列标题将是存储过程的名称。
下面的示例定义了一个匿名块,该块创建了两个相关的表。在此示例中,过程代码块不需要使用变量,因此省略了块的 DECLARE 部分。
BEGIN
CREATE TABLE parent (ID INTEGER);
CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
RETURN 'Completed';
END;
注意:如果您在 Python Connector 代码中使用 Snowflake CLI、SnowSQL、Classic Console 或者 execute_stream
或 execute_string
方法,请改用本示例(请参阅 在 Snowflake CLI、SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):
EXECUTE IMMEDIATE $$
BEGIN
CREATE TABLE parent (ID INTEGER);
CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
RETURN 'Completed';
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| Completed |
+-----------------+