存储过程和 UDTFs:调用中遵循的实参名称

注意

此行为变更在 2023_03 捆绑包中。

有关捆绑包的当前状态,请参阅 捆绑包历史记录

对存储过程和用户定义的表函数 (UDTFs) 进行调用时,如果调用中包含命名实参,则 Snowflake 会使实参名称优先于实参位置,如下所示。

之前:

对具有命名实参的过程或用户定义的表函数 (UDTFs) 进行调用时,Snowflake 会忽略实参名称,而使用实参位置来确定传递给过程或函数的值。

现在:

在调用过程和 UDTFs 时,实参名称将优先于实参位置。这可能会导致以下行为,与行为变更之前的行为不同:

  • 以前对存储过程或用户定义的表函数的调用可能会导致错误。

  • 实参名称可能会导致实参的传递顺序与以前不同。这可能会导致错误、错误结果或错误数据插入。

  • 实参名称可能会导致调用具有相同名称的其他存储过程。这可能会导致错误、错误结果或错误数据插入。

  • 下面的示例说明了在变更前后对两个存储过程的调用可能存在哪些不同。

下面的示例说明了在变更前后对两个存储过程的调用可能存在哪些不同。

-- One stored procedure
CREATE OR REPLACE PROCEDURE proc(STRARG1 varchar, STRARG2 varchar)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
BEGIN
  return 'hello';
END
$$;
-- Another procedure
CREATE OR REPLACE PROCEDURE proc(ARG1 number, ARG2 number)
RETURNS BOOLEAN
LANGUAGE SQL
AS
$$
BEGIN
  return ARG1 < ARG2;
END
$$;
-- Example A
-- Before: returns 'hello'
-- After: returns TRUE
CALL PROC(ARG1 => '5', ARG2 => '100');
-- Example B
-- Before: returns TRUE
-- After: returns 'hello'
CALL PROC(STRARG1 => 5, STRARG2 => 100); -- 'hello'.
Copy

参考:1017

语言: 中文