定义 UDFs 和存储过程的实参¶
在为定义函数或过程而执行的 CREATE FUNCTION 或 CREATE PROCEDURE 中,指定可以传入的实参。例如:
CREATE FUNCTION my_function(integer_argument INT, varchar_argument VARCHAR)
...
CREATE PROCEDURE my_procedure(boolean_argument BOOLEAN, date_argument DATE)
...
调用函数或过程时,实参值绑定到处理程序的实参。它们可能基于匹配的名称或实参位置进行绑定,具体取决于用于处理程序的语言。
本主题提供有关指定函数或过程的实参的指南。
输入实参数量的限制¶
标量函数 (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) { ... }
在 CREATE PROCEDURE 语句中,不要定义 Session
对象的实参。相反,只需为输入字符串定义一个实参:
CREATE OR REPLACE PROCEDURE query_table(table_name VARCHAR)
...
Session
是调用过程时未指定的隐式实参。运行时,当调用存储过程时,Snowflake 创建一个 Session
对象并将其传递给存储过程。
指定可选实参¶
可以指定实参是可选的。有关详细信息,请参阅接下来的部分:
将实参指定为可选的¶
如果希望实参是可选的,请使用 DEFAULT 关键字指定实参的默认值。例如:
CREATE OR REPLACE FUNCTION build_string_udf(
word VARCHAR,
prefix VARCHAR DEFAULT 'pre-',
suffix VARCHAR DEFAULT '-post'
)
...
CREATE OR REPLACE PROCEDURE build_string_proc(
word VARCHAR,
prefix VARCHAR DEFAULT 'pre-',
suffix VARCHAR DEFAULT '-post'
)
...
对于实参的默认值,可以使用表达式。例如:
CREATE OR REPLACE FUNCTION my_date_udf(optional_date_arg DATE DEFAULT CURRENT_DATE())
...
必须在必需实参(如果有)之后指定可选实参。不能在必需实参之前指定可选实参。
-- This is not allowed.
CREATE FUNCTION wrong_order(optional_argument INTEGER DEFAULT 0, required_argument INTEGER)
...
使用可选实参重载函数和过程¶
如果要 重载 函数或过程,则不能使用可选实参来区分不同的签名。例如,假设创建不传入任何实参的以下 UDF:
CREATE FUNCTION my_udf_a()
...
如果试图创建与可选实参中传递的名称相同的 UDF,CREATE FUNCTION 语句将失败:
CREATE FUNCTION my_udf_a(optional_arg INTEGER DEFAULT 0)
...
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)
...
如果试图创建一个同名的 UDF,并传入一个必需的 INTEGER 实参和一个可选实参,则 CREATE FUNCTION 语句将失败:
CREATE FUNCTION my_udf_b(required_arg INTEGER, optional_arg INTEGER DEFAULT 0)
...
000949 (42723): SQL compilation error:
Cannot overload FUNCTION 'MY_UDF_B' as it would cause ambiguous FUNCTION overloading.
这也会影响使用 ALTER FUNCTION ...RENAME 或 ALTER PROCEDURE ...RENAME 来重命名函数或过程的情况。如果要重命名函数或过程,则不能有具有相同名称和签名的现有函数。可选实参不会将一个签名与另一个签名区分开来。
例如,假设创建了一个名为 abc_udf
的 UDF,它传入了一个必需的 INTEGER 实参:
CREATE FUNCTION abc_udf(required_arg INTEGER)
...
假设创建了一个具有不同名称 (def_udf
) 的 UDF,它传入了一个必需的 INTEGER 实参和一个可选实参:
CREATE FUNCTION def_udf(required_arg INTEGER, optional_arg INTEGER DEFAULT 0)
...
如果试图将 def_udf
的名称更改为 abc_udf
,则会出现错误,因为已经有一个 UDF 具有相同的名称和相同类型的必需实参:
000949 (42723): SQL compilation error:
Cannot overload FUNCTION 'ABC_UDF' as it would cause ambiguous FUNCTION overloading.
调用具有可选实参的函数和过程¶
若要调用具有可选实参的函数和过程,请参阅: