SQL UDF 限制¶
本主题介绍用 SQL 编写的处理程序的限制。
实参和返回类型约束有时会被忽略¶
调用 UDF 时,会忽略为实参或返回值声明的某些类型特征。在这些情况下,无论收到的值是否符合声明中指定的约束,都可以将其用作收到的值。
对于用 SQL 编写逻辑的 UDFs,以下约束将被忽略:
NUMBER 类型的实参和返回值的精度和小数位数
VARCHAR 类型的实参和返回值的长度
示例¶
以下示例中的代码声明 arg1
实参和返回值必须为 VARCHAR 类型,并且长度不能超过一个字符。但是,使用值长于一个字符的 arg1
来调用此函数将会成功,就好像未指定该约束一样。
CREATE OR REPLACE FUNCTION tf (arg1 VARCHAR(1))
RETURNS VARCHAR(1)
LANGUAGE SQL AS 'SHA2(a)';
引用数据库对象时不支持动态 SQL¶
使用动态 SQL 来引用数据库对象将产生一个错误,其中包含如下文本:
Compilation of SQL UDF failed: SQL compilation error: syntax error... unexpected '<variable_name>'
如果需要构建使用不同数据库对象的动态 SQL 语句,请考虑编写存储过程。您可以使用以下语言之一编写存储过程:
示例¶
以下示例中的代码将失败,因为它使用 IDENTIFIER 函数来引用一个表,但此表的名称是使用 table_name_parameter
变量动态指定的。
CREATE OR REPLACE FUNCTION profit2(table_name_parameter VARCHAR)
RETURNS NUMERIC(11, 2)
AS
$$
SELECT SUM((retail_price - wholesale_price) * number_sold)
FROM IDENTIFIER(table_name_parameter)
$$
;