定义 UDFs 和存储过程的实参

在为定义函数或过程而执行的 CREATE FUNCTIONCREATE PROCEDURE 中,指定可以传入的实参。例如:

CREATE FUNCTION my_function(integer_argument INT, varchar_argument VARCHAR)
  ...
Copy
CREATE PROCEDURE my_procedure(boolean_argument BOOLEAN, date_argument DATE)
  ...
Copy

调用函数或过程时,实参值绑定到处理程序的实参。它们可能基于匹配的名称或实参位置进行绑定,具体取决于用于处理程序的语言。

本主题提供有关指定函数或过程的实参的指南。

输入实参数量的限制

标量函数 (UDFs) 最多有 500 个输入实参。

指定实参的数据类型

选择与处理程序代码中使用的实参的数据类型对应的 SQL 数据类型。

有关 Snowflake 如何将 SQL 数据类型映射到处理程序数据类型的信息,请参阅 SQL 与处理程序语言之间的数据类型映射

省略 Java、Python 和 Scala 过程的 Session 实参

在用 Java、Python 或 Scala 编写的过程的 CREATE PROCEDURE 语句中,不要定义 Snowpark Session 对象的实参。

例如,假设处理程序代码传入一个 Session 对象和一个 String 对象:

public String queryTable(Session session, String tableName) { ... }
Copy

在 CREATE PROCEDURE 语句中,不要定义 Session 对象的实参。相反,只需为输入字符串定义一个实参:

CREATE OR REPLACE PROCEDURE query_table(table_name VARCHAR)
  ...
Copy

Session 是调用过程时未指定的隐式实参。运行时,当调用存储过程时,Snowflake 创建一个 Session 对象并将其传递给存储过程。

指定可选实参

可以指定实参是可选的。有关详细信息,请参阅接下来的部分:

将实参指定为可选的

如果希望实参是可选的,请使用 DEFAULT 关键字指定实参的默认值。例如:

CREATE OR REPLACE FUNCTION build_string_udf(
    word VARCHAR,
    prefix VARCHAR DEFAULT 'pre-',
    suffix VARCHAR DEFAULT '-post'
  )
  ...
Copy
CREATE OR REPLACE PROCEDURE build_string_proc(
    word VARCHAR,
    prefix VARCHAR DEFAULT 'pre-',
    suffix VARCHAR DEFAULT '-post'
  )
  ...
Copy

对于实参的默认值,可以使用表达式。例如:

CREATE OR REPLACE FUNCTION my_date_udf(optional_date_arg DATE DEFAULT CURRENT_DATE())
  ...
Copy

必须在必需实参(如果有)之后指定可选实参。不能在必需实参之前指定可选实参。

-- This is not allowed.
CREATE FUNCTION wrong_order(optional_argument INTEGER DEFAULT 0, required_argument INTEGER)
  ...
Copy

使用可选实参重载函数和过程

如果要 重载 函数或过程,则不能使用可选实参来区分不同的签名。例如,假设创建不传入任何实参的以下 UDF:

CREATE FUNCTION my_udf_a()
  ...
Copy

如果试图创建与可选实参中传递的名称相同的 UDF,CREATE FUNCTION 语句将失败:

CREATE FUNCTION my_udf_a(optional_arg INTEGER DEFAULT 0)
  ...
Copy
000949 (42723): SQL compilation error:
  Cannot overload FUNCTION 'MY_UDF_A' as it would cause ambiguous FUNCTION overloading.

再举一个例子,假设创建了一个传入必需 INTEGER 实参的 UDF :

CREATE FUNCTION my_udf_b(required_arg INTEGER)
  ...
Copy

如果试图创建一个同名的 UDF,并传入一个必需的 INTEGER 实参和一个可选实参,则 CREATE FUNCTION 语句将失败:

CREATE FUNCTION my_udf_b(required_arg INTEGER, optional_arg INTEGER DEFAULT 0)
  ...
Copy
000949 (42723): SQL compilation error:
  Cannot overload FUNCTION 'MY_UDF_B' as it would cause ambiguous FUNCTION overloading.

这也会影响使用 ALTER FUNCTION ...RENAMEALTER PROCEDURE ...RENAME 来重命名函数或过程的情况。如果要重命名函数或过程,则不能有具有相同名称和签名的现有函数。可选实参不会将一个签名与另一个签名区分开来。

例如,假设创建了一个名为 abc_udf 的 UDF,它传入了一个必需的 INTEGER 实参:

CREATE FUNCTION abc_udf(required_arg INTEGER)
  ...
Copy

假设创建了一个具有不同名称 (def_udf) 的 UDF,它传入了一个必需的 INTEGER 实参和一个可选实参:

CREATE FUNCTION def_udf(required_arg INTEGER, optional_arg INTEGER DEFAULT 0)
  ...
Copy

如果试图将 def_udf 的名称更改为 abc_udf,则会出现错误,因为已经有一个 UDF 具有相同的名称和相同类型的必需实参:

000949 (42723): SQL compilation error:
  Cannot overload FUNCTION 'ABC_UDF' as it would cause ambiguous FUNCTION overloading.

调用具有可选实参的函数和过程

若要调用具有可选实参的函数和过程,请参阅:

语言: 中文