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)';
Copy

引用数据库对象时不支持动态 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)
  $$
  ;
Copy
语言: 中文