EXECUTE IMMEDIATE¶
执行包含 SQL 语句或 :doc:` Snowflake Scripting 语句 </developer-guide/snowflake-scripting/blocks>` 的字符串。
您可以使用 EXECUTE IMMEDIATE 执行以下操作:
在 Snowflake Scripting 块中,执行动态 SQL,其中部分 SQL 语句在运行时前是未知的。有关示例,请参阅 在 Snowflake Scripting 块中执行动态 SQL。
将会话变量设置为 SQL 语句,并引用会话变量来运行 SQL 语句。有关示例,请参阅 将会话变量设置为语句并执行它。
如果您正在使用 SnowSQL 或 Classic Console,请运行 Snowflake Scripting 匿名块。有关示例,请参阅 在 SnowSQL 或 Classic Console 中运行匿名块。
语法¶
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> ... ] ) ]
必填参数¶
可选参数¶
USING ( bind_variable [ , bind_variable ... ] )
指定一个或多个绑定变量,这些变量保存要在游标的查询定义中(例如,在 WHERE 子句中)使用的值。
返回¶
EXECUTE IMMEDIATE 返回已执行语句的结果。例如,如果字符串或变量包含 SELECT 语句,则返回 SELECT 语句的结果集。
使用说明¶
string_literal
、variable
或session_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;
注意:如果您在 Python Connector 代码中使用 SnowSQL、Classic Console 或者 execute_stream
或 execute_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;
$$;
调用存储过程:
CALL execute_immediate_local_variable();
+----------------------------------+
| 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);
创建存储过程:
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;
注意:如果您在 Python Connector 代码中使用 SnowSQL、Classic Console 或者 execute_stream
或 execute_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;
$$
;
调用存储过程:
CALL min_max_invoices_sp(20, 30);
+----+-------+
| ID | PRICE |
|----+-------|
| 2 | 22.22 |
+----+-------+
将会话变量设置为语句并执行它¶
此示例执行会话变量中定义的语句:
SET stmt =
$$
SELECT PI();
$$
;
EXECUTE IMMEDIATE $stmt;
+-------------+
| PI() |
|-------------|
| 3.141592654 |
+-------------+
在 SnowSQL 或 Classic Console 中运行匿名块¶
在 SnowSQL 或 Classic 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;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 28.274333882 |
+-----------------+