了解 Snowflake Scripting 中的块

在 Snowflake Scripting 中,您可在 Snowflake Scripting 块中编写过程代码。本主题介绍了如何在块中编写过程代码。

了解块的结构

块具有以下基本结构:

DECLARE
  -- (variable declarations, cursor declarations, etc.) ...
BEGIN
  -- (Snowflake Scripting and SQL statements) ...
EXCEPTION
  -- (statements for handling exceptions) ...
END;
Copy

块由必填部分和可选部分组成,这些部分由关键字分隔。每个部分都有不同的用途:

  • 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;
Copy

重要

启动块的关键字 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;
Copy

此示例声明了一个变量,使用该变量,并返回该变量的值。有关如何从块中返回值的详细信息,请参阅 返回值

这些变量不能在块之外使用。请参阅 了解声明的范围

您还可以在块的 BEGIN ...END 部分使用 LET 声明一个变量。有关详细信息,请参阅 声明变量

在存储过程中使用块

可以在存储过程的定义中使用块。以下是一个示例,您可以在 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;
Copy

注意:如果您在 Python Connector 代码中使用 SnowSQLClassic Console 或者 execute_streamexecute_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;
$$
;
Copy

可使用 CALL 命令调用存储过程。以下示例调用前一示例中的存储过程 area

CALL area();
Copy

存储过程返回以下输出:

+--------------+
|         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;
Copy

注意:如果您在 Python Connector 代码中使用 SnowSQLClassic Console 或者 execute_streamexecute_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;
$$
;
Copy

此示例生成以下输出:

+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+

输出中的列标题是 anonymous block;如果代码是在存储过程中执行,则列标题将是存储过程的名称。

下面的示例定义了一个匿名块,该块创建了两个相关的表。在此示例中,过程代码块不需要使用变量,因此省略了块的 DECLARE 部分。

BEGIN
  CREATE TABLE parent (ID INTEGER);
  CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
  RETURN 'Completed';
END;
Copy

注意:如果您在 Python Connector 代码中使用 SnowSQLClassic Console 或者 execute_streamexecute_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;
$$
;
Copy
+-----------------+
| anonymous block |
|-----------------|
| Completed       |
+-----------------+
语言: 中文