Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector

This topic explains how to run the Snowflake Scripting examples in Snowflake CLI, SnowSQL, and the Python Connector.

备注

If you are using other clients and interfaces, such as Snowflake CLI or the JDBC driver, you can skip this topic and refer to Snowflake Scripting blocks.

简介

目前,以下接口无法正确解析 Snowflake Scripting 块:

输入并运行 Snowflake Scripting 块可能会导致以下错误:

SQL compilation error: syntax error line 2 at position 25 unexpected '<EOF>'
Copy

要解决此问题,请在 Snowflake Scripting 块的开头和结尾周围使用分隔符(如果您正在使用这些接口)。

以下各节说明如何执行此操作:

在存储过程中的块周围使用字符串常量分隔符

如果要创建存储过程,请将 Snowflake Scripting 块放在 单引号或双美元符号 中。例如:

CREATE OR REPLACE PROCEDURE myprocedure()
  RETURNS VARCHAR
  LANGUAGE SQL
  AS
  $$
    -- Snowflake Scripting code
    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

备注

在 Snowflake CLI 命令行上直接指定脚本块时,$$ 分隔符可能在某些 shell 中无法正常运行,因为它们会将该分隔符解释为其他内容。例如,bash 和 zsh shell 会将其解释为过程 ID (PID)。为解决此限制,您可以使用以下替代方案:

  • 如果您仍然想在命令行上指定脚本块,可以转义 $$ 分隔符,如 \$\$ 中所示。

  • 您还可以将带有默认 $$ 分隔符的脚本块放入单独的文件中,并使用 snow sql -f <filename> 命令进行调用。

将块作为字符串字面量传递给 EXECUTE IMMEDIATE

如果您正在编写一个 :ref:` 匿名块 <label-snowscript_block_anonymous>` ,请将该块作为字符串字面量传递给 EXECUTE IMMEDIATE 命令。要分隔字符串字面量,请使用 单引号或双美元符号

例如:

EXECUTE IMMEDIATE $$
-- Snowflake Scripting code
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

或者,您可以定义一个 会话变量,该变量是包含块的字符串字面量,并且可以将该会话变量传递给 EXECUTE IMMEDIATE 命令。例如:

SET stmt =
$$
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;
$$
;

EXECUTE IMMEDIATE $stmt;
Copy

备注

在 Snowflake CLI 命令行上直接指定脚本块时,$$ 分隔符可能在某些 shell 中无法正常运行,因为它们会将该分隔符解释为其他内容。例如,bash 和 zsh shell 会将其解释为过程 ID (PID)。为解决此限制,您可以使用以下替代方案:

  • 如果您仍然想在命令行上指定脚本块,可以转义 $$ 分隔符,如 \$\$ 中所示。

  • 您还可以将带有默认 $$ 分隔符的脚本块放入单独的文件中,并使用 snow sql -f <filename> 命令进行调用。

语言: 中文