CALL

调用 存储过程

另请参阅:

CREATE PROCEDURESHOW PROCEDURES

语法

CALL <procedure_name> ( [ [ <arg_name> => ] <arg> , ... ] )
  [ INTO :<snowflake_scripting_variable> ]
Copy

必填参数

procedure_name ( [ [ arg_name => ] arg , ... ] )

指定要调用的过程的标识符 (procedure_name) 和任何输入实参。

您可以按名称 (arg_name => arg) 或位置 (arg) 指定输入实参。

请注意以下事项:

  • 必须按名称或位置指定所有实参。不能按名称指定某些实参,也不能按位置指定其他实参。

    按名称指定实参时,不能在实参名称前后使用双引号。

  • 如果两个函数或两个过程的名称相同但实参类型不同,那么在实参名称不同的情况下,可以使用实参名称来指定要执行的函数或过程。请参阅 重载过程和函数

可选参数

INTO :snowflake_scripting_variable

将指定的 Snowflake Scripting 变量 设置为存储过程的返回值。

示例

有关创建和调用存储过程的更多示例,请参阅 使用存储过程

CALL stproc1(5.14::FLOAT);
Copy

存储过程的每个实参都可以是通用表达式:

CALL stproc1(2 * 5.14::FLOAT);
Copy

实参可以是子查询:

CALL stproc1(SELECT COUNT(*) FROM stproc_test_table1);
Copy

每个 CALL 语句只能调用一个存储过程。例如,以下语句失败:

CALL proc1(1), proc2(2);                          -- Not allowed
Copy

此外,不能将存储过程 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
Copy

但是,在存储过程中,存储过程可以调用另一个存储过程,也可以以递归方式调用自身。

小心

嵌套调用可能会超过允许的最大堆栈深度,因此在嵌套调用时要小心,尤其是在使用递归时。

以下示例调用名为 sv_proc1 的存储过程,并传入字符串字面量和数字作为输入实参。此示例按位置指定实参:

CALL sv_proc1('Manitoba', 127.4);
Copy

您还可以按其名称指定实参:

CALL sv_proc1(province => 'Manitoba', amount => 127.4);
Copy

以下示例演示如何设置 会话变量 并将其作为输入实参传递给存储过程:

SET Variable1 = 49;
CALL sv_proc2($Variable1);
Copy

以下是 Snowflake Scripting 块的示例,该块获取 Snowflake Scripting 变量中存储过程的返回值。

DECLARE
  ret1 NUMBER;
BEGIN
  CALL sv_proc1('Manitoba', 127.4) into :ret1;
  RETURN ret1;
END;
Copy

注意:如果您在 Python Connector 代码中使用 Snowflake CLISnowSQLClassic Console 或者 execute_streamexecute_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;
$$
;
Copy
语言: 中文