创建用户自定义函数

您可以通过添加您自己的或第三方供应商的功能定义来扩展 Db2 的SQL功能。

准备工作

按照安装步骤21:配置 Db2 以运行存储过程和用户定义的函数中的描述,为用户定义的函数设置环境。

关于本任务

用户定义函数是一个可以编写用于执行操作的小程序,类似于主机语言子程序或函数。 然而,用户定义的函数通常是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建立的地址空间(用户自定义功能在此执行),如下图所示。

图 1。 用户自定义函数环境
开始图 summary.A 框组显示了程序地址空间 Db2 和 WLM 地址空间之间的流程。 可提供详细说明。

有关Java™用户定义函数的信息,请参阅 Java存储过程和用户定义函数。 关于其他语言的用户自定义功能,请参阅以下说明。

过程

创建用户自定义函数:

  1. 编写和准备用户自定义函数,如编写外部用户自定义函数中所述。
    仅当外部用户自定义函数时,才需要执行此步骤。
  2. 通过发出CREATE FUNCTION语句来定义用户自定义函数,并将其发送至 Db2 ,该语句指定了要创建的函数类型。
    更多信息,请参阅 CREATE FUNCTION语句(概述 )。
  3. 从SQL应用程序调用用户自定义函数,如调用用户自定义函数中所述。

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来更改用户定义函数定义的某些特性。