EXECUTE IMMEDIATE

执行包含 SQL 语句或 :doc:` Snowflake Scripting 语句 </developer-guide/snowflake-scripting/blocks>` 的字符串。

您可以使用 EXECUTE IMMEDIATE 执行以下操作:

语法

EXECUTE IMMEDIATE '<string_literal>'
    [ USING ( <bind_variable> [ , <bind_variable> ... ] ) ]

EXECUTE IMMEDIATE <variable>
    [ USING ( <bind_variable> [ , <bind_variable> ... ] ) ]

EXECUTE IMMEDIATE $<session_variable>
    [ USING ( <bind_variable> [ , <bind_variable> ... ] ) ]
Copy

必填参数

'string_literal' . variable . session_variable

包含语句的字符串字面量、Snowflake Scripting 变量会话变量。语句可以是以下任一语句:

  • 单个 SQL 语句

  • 存储过程调用

  • 控制流语句(例如 循环 语句或 分支 语句)

如果使用会话变量,则语句的长度不得超过 :ref:` 会话变量的最大大小(256 字节)<label-initializing_session_variables>`。

可选参数

USING ( bind_variable [ , bind_variable ... ] )

指定一个或多个绑定变量,这些变量保存要在游标的查询定义中(例如,在 WHERE 子句中)使用的值。

返回

EXECUTE IMMEDIATE 返回已执行语句的结果。例如,如果字符串或变量包含 SELECT 语句,则返回 SELECT 语句的结果集。

使用说明

  • string_literalvariablesession_variable 必须只包含一个语句。(一个 被视为一个语句,即使该块的主体包含多个语句。)

  • session_variable 前面必须有一个美元符号 ($)。

  • 局部 variable 前面 不得 有美元符号 ($)。

示例

下面是使用 EXECUTE IMMEDIATE 命令的示例。

在 Snowflake Scripting 块中执行动态 SQL

以下示例在 Snowflake Scripting 块中执行动态 SQL。

执行包含变量的语句

此示例将执行在 Snowflake Scripting 存储过程中两个局部变量中定义的语句。此示例也表明,EXECUTE IMMEDIATE 不仅适用于字符串字面量,还适用于计算结果为字符串 (VARCHAR) 的表达式。

CREATE PROCEDURE execute_immediate_local_variable()
RETURNS VARCHAR
AS
DECLARE
  v1 VARCHAR DEFAULT 'CREATE TABLE temporary1 (i INTEGER)';
  v2 VARCHAR DEFAULT 'INSERT INTO temporary1 (i) VALUES (76)';
  result INTEGER DEFAULT 0;
BEGIN
  EXECUTE IMMEDIATE v1;
  EXECUTE IMMEDIATE v2  ||  ',(80)'  ||  ',(84)';
  result := (SELECT SUM(i) FROM temporary1);
  RETURN result::VARCHAR;
END;
Copy

注意:如果您在 Python Connector 代码中使用 SnowSQLClassic Console 或者 execute_streamexecute_string 方法,请改用本示例(请参阅 在 SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):

CREATE PROCEDURE execute_immediate_local_variable()
RETURNS VARCHAR
AS
$$
DECLARE
  v1 VARCHAR DEFAULT 'CREATE TABLE temporary1 (i INTEGER)';
  v2 VARCHAR DEFAULT 'INSERT INTO temporary1 (i) VALUES (76)';
  result INTEGER DEFAULT 0;
BEGIN
  EXECUTE IMMEDIATE v1;
  EXECUTE IMMEDIATE v2  ||  ',(80)'  ||  ',(84)';
  result := (SELECT SUM(i) FROM temporary1);
  RETURN result::VARCHAR;
END;
$$;
Copy

调用存储过程:

CALL execute_immediate_local_variable();
Copy
+----------------------------------+
| EXECUTE_IMMEDIATE_LOCAL_VARIABLE |
|----------------------------------|
| 240                              |
+----------------------------------+

执行包含绑定变量的语句

此示例使用 EXECUTE IMMEDIATE 执行 Snowflake Scripting 存储过程中 USING 参数中包含绑定变量的 SELECT 语句。首先,创建表并插入数据:

CREATE OR REPLACE TABLE invoices (id INTEGER, price NUMBER(12, 2));

INSERT INTO invoices (id, price) VALUES
  (1, 11.11),
  (2, 22.22);
Copy

创建存储过程:

CREATE OR REPLACE PROCEDURE min_max_invoices_sp(
    minimum_price NUMBER(12,2),
    maximum_price NUMBER(12,2))
  RETURNS TABLE (id INTEGER, price NUMBER(12, 2))
  LANGUAGE SQL
AS
DECLARE
  rs RESULTSET;
  query VARCHAR DEFAULT 'SELECT * FROM invoices WHERE price > ? AND price < ?';
BEGIN
  rs := (EXECUTE IMMEDIATE :query USING (minimum_price, maximum_price));
  RETURN TABLE(rs);
END;
Copy

注意:如果您在 Python Connector 代码中使用 SnowSQLClassic Console 或者 execute_streamexecute_string 方法,请改用本示例(请参阅 在 SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):

CREATE OR REPLACE PROCEDURE min_max_invoices_sp(
    minimum_price NUMBER(12,2),
    maximum_price NUMBER(12,2))
  RETURNS TABLE (id INTEGER, price NUMBER(12, 2))
  LANGUAGE SQL
AS
$$
DECLARE
  rs RESULTSET;
  query VARCHAR DEFAULT 'SELECT * FROM invoices WHERE price > ? AND price < ?';
BEGIN
  rs := (EXECUTE IMMEDIATE :query USING (minimum_price, maximum_price));
  RETURN TABLE(rs);
END;
$$
;
Copy

调用存储过程:

CALL min_max_invoices_sp(20, 30);
Copy
+----+-------+
| ID | PRICE |
|----+-------|
|  2 | 22.22 |
+----+-------+

将会话变量设置为语句并执行它

此示例执行会话变量中定义的语句:

SET stmt =
$$
    SELECT PI();
$$
;
Copy
EXECUTE IMMEDIATE $stmt;
Copy
+-------------+
|        PI() |
|-------------|
| 3.141592654 |
+-------------+

在 SnowSQL 或 Classic Console 中运行匿名块

SnowSQLClassic Console 中运行 Snowflake Scripting 匿名块时,必须将块指定为字符串字面量(用单引号或双美元符号分隔),并且必须将块传递给 EXECUTE IMMEDIATE 命令。有关更多信息,请参阅 在 SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting

此示例会运行传递给 EXECUTE IMMEDIATE 命令的匿名块:

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 |
+-----------------+
语言: 中文