创建用户自定义函数
您可以通过添加您自己的或第三方供应商的功能定义来扩展 Db2 的SQL功能。
准备工作
关于本任务
用户定义函数是一个可以编写用于执行操作的小程序,类似于主机语言子程序或函数。 然而,用户定义的函数通常是SQL应用程序的更好选择,因为您可以在SQL语句中调用它。 用户自定义函数使用CREATE FUNCTION语句创建,并注册到 Db2 的目录中。
用户自定义函数由函数名和括号内零个或多个操作数组成。 用户定义函数就像一个内置函数,它表示一组输入值和一组结果值之间的关系。 在函数定义中,函数的输入值称为参数。 当函数被调用时,输入的值称为参数。 例如,一个函数可以传递两个输入参数,它们具有日期和时间数据类型,并返回一个具有时间戳数据类型的值作为结果。
您可以创建多种不同类型的用户自定义函数,包括外部函数、SQL函数和源用户自定义函数。 用户自定义函数也可以分为标量函数(返回单个值)和表函数(返回一个表)。 具体来说,您可以创建以下类型的用户自定义函数:
- 外部标量
- 该函数是用编程语言编写的,并返回标量值。 外部可执行程序(包)与函数的各种属性一起在数据库服务器中注册。 每次调用该函数时,程序包都会执行一次或多次。 参见 CREATE FUNCTION语句(外部标量函数 )。
- 外部表
- 该功能是用编程语言编写的。 每次启动函数时,它都会返回一个表,该表是从子选择开始的,每次返回一行。 外部可执行程序(包)与函数的各种属性一起在数据库服务器中注册。 每次调用该函数时,程序包都会执行一次或多次。 参见 CREATE FUNCTION语句(外部表函数 )。
- 有源
- 该功能通过调用服务器上存在的另一个函数(内置、外部、SQL或源代码)来实现。 该函数继承了基础源函数的属性。 源函数没有关联的包。 参见 CREATE FUNCTION语句(源函数 )。
- SQL 标量
- 该函数仅以SQL语句编写,并返回一个标量值。 SQL标量函数的主体是用SQL过程语言(SQL PL)编写的。 函数及其各种属性在当前服务器上定义。Db2 支持两种类型的SQL标量函数,内联和编译:
- 内联SQL标量函数包含一个RETURN语句,用于返回简单表达式的值。 该函数不作为查询的一部分调用,而是将函数RETURN语句中的表达式复制(内联)到查询本身中。 因此,内联SQL标量函数不会生成包。
- 编译的SQL标量函数支持更广泛的功能,包括所有SQL PL语句。 为编译的SQL标量函数生成一个包。 它包含函数的主体,包括控制语句。 它可能还包含由 Db2 生成的语句。 每次调用该函数时,程序包都会执行一次或多次。
当处理 SQL 标量函数的 CREATE FUNCTION 语句时, Db2 会尝试创建内联 SQL 标量函数。 如果无法创建内联函数, Db2 将尝试创建一个已编译的SQL标量函数。 有关这些类型的函数的语法和规则的更多信息,请参阅 CREATE FUNCTION 语句(内联 SQL 标量函数) 和 CREATE FUNCTION 语句(编译 SQL 标量函数)。
要确定创建的是哪种类型的SQL标量函数,请参阅 SYSIBM.SYSROUTINES 目录表的INLINE列。
- SQL 表
- 该函数仅以SQL RETURN语句的形式编写,并返回一组行。 SQL表函数的主体是用SQL过程语言编写的。 该功能与各种属性一起在当前服务器上定义。 该函数不作为查询的一部分调用。 相反,函数的RETURN语句中的表达式被复制(内联)到查询本身中。 因此,不会为SQL表函数生成包。 参见 CREATE FUNCTION语句(SQL表函数 )。
用户自定义功能的环境包括应用程序地址空间(程序从中调用用户自定义功能)、 Db2 系统(用户自定义功能中的程序包在此运行)以及WLM建立的地址空间(用户自定义功能在此执行),如下图所示。
有关Java™用户定义函数的信息,请参阅 Java存储过程和用户定义函数。 关于其他语言的用户自定义功能,请参阅以下说明。
过程
创建用户自定义函数:
SQL用户自定义标量函数的定义
您可以定义一个SQL用户自定义函数,使用现有的内置SIN和COS函数来计算一个值的切线:
CREATE FUNCTION TAN (X DOUBLE)
RETURNS DOUBLE
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
RETURN SIN(X)/COS(X);
RETURN SIN(X)/COS(X)后续操作
如果您在定义函数后发现需要更改部分定义,可以使用ALTER FUNCTION语句来更改定义。 您不能使用ALTER FUNCTION来更改用户定义函数定义的某些特性。