CALL¶
调用 存储过程。
语法¶
CALL <procedure_name> ( [ [ <arg_name> => ] <arg> , ... ] )
[ INTO :<snowflake_scripting_variable> ]
必填参数¶
procedure_name ( [ [ arg_name => ] arg , ... ] )
指定要调用的过程的标识符 (
procedure_name
) 和任何输入实参。您可以按名称 (
arg_name => arg
) 或位置 (arg
) 指定输入实参。请注意以下事项:
必须按名称或位置指定所有实参。不能按名称指定某些实参,也不能按位置指定其他实参。
按名称指定实参时,不能在实参名称前后使用双引号。
如果两个函数或两个过程的名称相同但实参类型不同,那么在实参名称不同的情况下,可以使用实参名称来指定要执行的函数或过程。请参阅 重载过程和函数。
可选参数¶
INTO :snowflake_scripting_variable
将指定的 Snowflake Scripting 变量 设置为存储过程的返回值。
示例¶
有关创建和调用存储过程的更多示例,请参阅 使用存储过程。
CALL stproc1(5.14::FLOAT);
存储过程的每个实参都可以是通用表达式:
CALL stproc1(2 * 5.14::FLOAT);
实参可以是子查询:
CALL stproc1(SELECT COUNT(*) FROM stproc_test_table1);
每个 CALL 语句只能调用一个存储过程。例如,以下语句失败:
CALL proc1(1), proc2(2); -- Not allowed
此外,不能将存储过程 CALL 用作表达式的一部分。例如,以下所有语句都失败:
CALL proc1(1) + proc1(2); -- Not allowed
CALL proc1(1) + 1; -- Not allowed
CALL proc1(proc2(x)); -- Not allowed
SELECT * FROM (call proc1(1)); -- Not allowed
但是,在存储过程中,存储过程可以调用另一个存储过程,也可以以递归方式调用自身。
小心
嵌套调用可能会超过允许的最大堆栈深度,因此在嵌套调用时要小心,尤其是在使用递归时。
以下示例调用名为 sv_proc1
的存储过程,并传入字符串字面量和数字作为输入实参。此示例按位置指定实参:
CALL sv_proc1('Manitoba', 127.4);
您还可以按其名称指定实参:
CALL sv_proc1(province => 'Manitoba', amount => 127.4);
以下示例演示如何设置 会话变量 并将其作为输入实参传递给存储过程:
SET Variable1 = 49;
CALL sv_proc2($Variable1);
以下是 Snowflake Scripting 块的示例,该块获取 Snowflake Scripting 变量中存储过程的返回值。
DECLARE
ret1 NUMBER;
BEGIN
CALL sv_proc1('Manitoba', 127.4) into :ret1;
RETURN ret1;
END;
注意:如果您在 Python Connector 代码中使用 Snowflake CLI、SnowSQL、Classic Console 或者 execute_stream
或 execute_string
方法,请改用本示例(请参阅 在 Snowflake CLI、SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):
EXECUTE IMMEDIATE $$
DECLARE
ret1 NUMBER;
BEGIN
CALL sv_proc1('Manitoba', 127.4) into :ret1;
RETURN ret1;
END;
$$
;