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);
Each argument to a stored procedure can be a general expression:
CALL stproc1(2 * 5.14::FLOAT);
An argument can be a subquery:
CALL stproc1(SELECT COUNT(*) FROM stproc_test_table1);
You can call only one stored procedure per CALL statement. For example, the following statement fails:
CALL proc1(1), proc2(2); -- Not allowed
Also, you cannot use a stored procedure CALL as part of an expression. For example, all the following statements fail:
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
However, inside a stored procedure, the stored procedure can call another stored procedure, or call itself recursively.
小心
Nested calls can exceed the maximum allowed stack depth, so be careful when nesting calls, especially when using recursion.
以下示例调用名为 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 代码中使用 SnowSQL、Classic Console 或者 execute_stream
或 execute_string
方法,请改用本示例(请参阅 在 SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):
EXECUTE IMMEDIATE $$
DECLARE
ret1 NUMBER;
BEGIN
CALL sv_proc1('Manitoba', 127.4) into :ret1;
RETURN ret1;
END;
$$
;