了解 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 代码中使用 SnowSQL、Classic Console 或者 execute_stream
或 execute_string
方法,请改用本示例(请参阅 在 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 |
+--------------+
使用匿名块¶
如果不想将块存储在数据库的存储过程中,则可以定义和使用 匿名块。匿名块是不属于存储过程的块。您可以将块定义为单独、独立的 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;
注意:如果您在 Python Connector 代码中使用 SnowSQL、Classic Console 或者 execute_stream
或 execute_string
方法,请改用本示例(请参阅 在 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 代码中使用 SnowSQL、Classic Console 或者 execute_stream
或 execute_string
方法,请改用本示例(请参阅 在 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 |
+-----------------+