CREATE FUNCTION(外部表)
此 CREATE FUNCTION (外部表) 语句定义当前服务器上的外部表函数。 此函数返回结果表。
可在子查询的 FROM 子句中使用外部用户定义的 表函数 ,并通过每次调用表时返回一行来将表返回到子查询。
调用
此语句可嵌入应用程序中或者以交互方式发出。 它是可以动态准备的可执行语句。
授权
此语句的授权标识所拥有的特权必须至少包括下列其中一项:
- 对于 SYSFUNCS 目录视图和 SYSPARMS 目录表:
- 对表的 INSERT 特权,以及
- 对模式 QSYS2 的 USAGE 特权
- 数据库管理员权限
如果外部程序或服务程序存在,那么语句的授权标识所拥有的特权必须至少包含下列其中一项:
- 对于 SQL 语句中引用的外部程序或服务程序:
- 对包含外部程序或服务程序的模式的 USAGE 特权。
- 系统授权 *EXECUTE 外部程序或服务程序。
- 数据库管理员权限
如果指定了 SQL 名称,并且存在与创建函数的库同名的用户概要文件,并且该名称与语句的授权标识不同,那么该语句的授权标识所拥有的特权必须至少包含下列其中一项:
- 对具有该名称的用户概要文件的系统权限 *ADD
- 数据库管理员权限
如果引用了单值类型,那么语句的授权标识所拥有的特权必须至少包含下列其中一项:
- 对于语句中标识的每个单值类型:
- 单值类型的 USAGE 特权,以及
- 对包含单值类型的模式的 USAGE 特权
- 数据库管理员权限
要替换现有函数,语句的授权标识所拥有的特权必须至少包含下列其中一项:
- 以下系统权限:
系统授权 *EXECUTE 外部程序或服务程序。
- DROP 函数所需的所有权限
- 对 SYSFUNCS 目录视图和 SYSPARMS 目录表的系统权限 *READ
- 数据库管理员权限
有关与 SQL 特权对应的系统权限的信息,请参阅 检查对表或视图的特权时的相应系统权限 和 检查对单值类型的特权时的相应系统权限。
语法
描述
- OR REPLACE
- 指定替换当前服务器上存在的函数的定义。 在目录中替换新定义之前,将有效删除现有定义,但对该功能授予的特权不受影响。 如果当前服务器上不存在函数的定义,那么将忽略此选项。 要替换现有函数,新定义的 specific-name 和 function-name 必须与旧定义的 specific-name 和 function-name 相同。 或者新定义的签名必须与旧定义的签名相匹配。 否则,将创建新的函数。
- 函数名
- 命名用户定义的函数。 除非指定了 OR REPLACE ,否则名称,模式名称,参数数量和每个参数的数据类型 (不考虑数据类型的任何长度,精度,小数位或 CCSID 属性) 的组合不得标识当前服务器上存在的用户定义的函数。
对于 SQL 命名,将在隐式或显式限定符指定的模式中创建函数。
对于系统命名,将在限定符指定的模式中创建函数。 如果未指定限定符:
- 如果 CURRENT SCHEMA 专用寄存器的值是 *LIBL ,那么将在当前库 (*CURLIB) 中创建该函数。
- 否则,将在当前模式中创建函数。
通常,如果每个函数的函数特征符都是唯一的,那么多个函数可以具有相同的名称。
某些函数名保留供系统使用。 有关详细信息,请参阅 CREATE FUNCTION 中的选择模式和函数名。
- (parameter-声明 ...)
- 指定函数的输入参数数目以及每个参数的数据类型。 每个 参数-声明 指定函数的输入参数。
参数的最大数目取决于语言类型:
- 对于 JAVA 和 ILE 程序以及服务程序,最大值为 2000。
- 对于 OPM 程序,最大值为 90。
最大参数数可进一步受语言允许的最大参数数的限制。
函数可以具有零个或多个输入参数。 对于函数期望接收的每个参数,列表中必须有一个条目。 函数的所有参数都是可空的输入参数。 对于 JAVA ,除 DECIMAL 和 NUMERIC 类型以外的数字参数不可为空。 如果对调用 ON NULL INPUT 函数的此类参数输入了空值,那么将发生运行时错误。 有关详细信息,请参阅在 CREATE FUNCTION 中定义参数。- 参数名称
- 命名参数。 虽然不是必需的,但可以为每个参数指定参数名称。 名称不能与参数列表中的任何其他 parameter-name 相同。
- data-type1
- 指定输入参数的数据类型。 数据类型可以是内置数据类型或单值类型。 它不能是数组类型。
- 内置类型
- 指定内置数据类型。 有关每种内置数据类型的更完整说明,请参阅 CREATE TABLE。 某些数据类型并非在所有语言中都受支持。 有关 SQL 数据类型与主语言数据类型之间的映射的详细信息,请参阅 嵌入式 SQL 编程 主题集合。 如果内置数据类型规范对应于用于编写用户定义的函数的语言,那么可以指定这些规范。
- distinct-type-name
- 指定用户定义的单值类型。 参数的长度,精度或小数位属性是单值类型的源类型 (在 CREATE TYPE 上指定的那些类型) 的属性。 有关创建区分类型的更多信息,请参阅 CREATE TYPE (distinct)
如果未限定单值类型的名称,那么数据库管理器将通过在 SQL 路径中搜索模式来解析模式名称。
当指定了 PARAMETER STYLE JAVA 时,不支持具有大对象 (LOB) 数据类型的参数。
如果指定了 CCSID ,那么在将该参数传递给该函数之前,该参数将转换为该 CCSID。 如果未指定 CCSID ,那么在调用该函数时, CCSID 由当前服务器上的缺省 CCSID 确定。
日期,时间和时间戳记参数作为 ISO 格式的字符串传递到过程。
具有 XML 类型的任何参数都必须指定 XML-cast-type 子句或 AS LOCATOR 子句。
- AS 定位器
- 指定输入参数是值的定位器,而不是实际值。 仅当输入参数具有 LOB 或 XML 数据类型或基于 LOB 或 XML 数据类型的单值类型时,才能指定 AS LOCATOR。 如果指定了 AS LOCATOR ,那么不得指定 FOR SBCS DATA 或 FOR MIXED DATA。
有关 AS LOCATOR 子句的更多信息,请参阅在 CREATE FUNCTION 中为参数指定 AS LOCATOR。
- AS XML-cast-type
- 指定传递到参数的函数的数据类型,该参数是 XML 类型或基于 XML 类型的单值类型。 如果指定了 LOCATOR ,那么该参数是值的定位器,而不是实际值。
如果指定了 CCSID 值,那么只能对图形数据类型指定 Unicode CCSID 值。 如果未指定 CCSID 值,那么在根据 SQL_XML_DATA_CCSID QAQQINI 选项设置创建函数时将建立 CCSID。 缺省 CCSID 为 1208。 有关此选项的说明,请参阅 XML 值。
- 默认条款
- 指定参数的缺省值。 默认值可以是常数、特殊寄存器、全局变量、表达式、
a 搜索条件、
或关键字 NULL。 表达式是 Expressions 中定义的任何表达式,不包括聚合函数或列名。
如果指定了 搜索条件,则它不得包含 EXISTS 或 IN 谓词中的子查询。
如果未指定默认值,则该参数没有默认值,在调用时不能省略。 表达式字符串的最大长度为 64K。缺省表达式必须是与参数数据类型兼容的赋值。
缺省表达式中用作列表中数字常量的分隔符的任何逗号都必须后跟空格。
创建函数时,缺省表达式中引用的所有对象都必须存在。 调用函数时,将使用调用者的权限对缺省值进行求值。
不能为数组类型的参数指定缺省值。
- 返回表
- 指定函数的输出是表。 此子句后面的括号将结果表的列的名称和数据类型的列表括起来。
最大结果列数取决于语言类型。 假定参数数目为 N。
- 对于 JAVA 和 ILE 程序以及服务程序,不得超过 8000- N 列。
- 对于 OPM 程序,不能超过 125- N 列。
- 列名称
- 指定输出表的列的名称。 请勿多次指定相同名称。
- data-type2
- 指定列的数据类型。 该列可空。
您可以指定任何内置数据类型 (LONG VARCHAR , LONG VARGRAPHIC 或 DataLink除外) 或单值类型 (不基于 DataLink)。 不能指定数组类型。
如果指定了 DATE 或 TIME ,那么表函数必须以 ISO 格式返回日期或时间。
如果指定了 CCSID ,
- 如果未指定 AS LOCATOR ,那么假定返回的结果以该 CCSID 编码。
- 如果指定了 AS LOCATOR ,并且定位器所指向的数据的 CCSID 以不同的 CCSID 进行编码,那么会将数据转换为指定的 CCSID。
如果未指定 CCSID ,
- 如果未指定 AS LOCATOR ,那么假定返回的结果以作业的 CCSID (或与作业的图形字符串返回值相关联的图形 CCSID) 进行编码。
- 如果指定了 AS LOCATOR ,那么会将定位器指向的数据转换为作业的 CCSID ,如果定位器指向的数据的 CCSID 以不同的 CCSID 编码。 为了避免在转换期间任何可能的字符丢失,请考虑显式指定可以表示将从函数返回的任何字符的 CCSID。 如果数据类型是图形字符串数据,那么这尤其重要。 在这种情况下,请考虑使用 CCSID 1200 或 13488 (Unicode 图形字符串数据)。
- AS 定位器
- 指定函数将定位器返回到列的值而不是实际值。 只能对 LOB 或 XML 数据类型或基于 LOB 或 XML 数据类型的单值类型指定 AS LOCATOR。 如果指定了 AS LOCATOR ,那么不得指定 FOR SBCS DATA 或 FOR MIXED DATA。
有关 AS LOCATOR 子句的更多信息,请参阅在 CREATE FUNCTION 中为参数指定 AS LOCATOR。
- 语言
- 语言子句指定外部程序的语言。
如果未指定 LANGUAGE ,那么在创建函数时,将根据与外部程序关联的程序属性信息来确定 LANGUAGE。 在下列情况下,假定程序的语言为 C:
- 与程序关联的程序属性信息未标识可识别的语言
- 找不到程序
- C
- 外部程序是用 C 编写的。
- C++
- 外部程序以 C++ 编写。
- cl
- 外部程序以 CL 或 ILE CL 编写。
- COBOL
- 外部程序是用 COBOL 编写的。
- COBOLLE
- 外部程序是用 ILE COBOL 编写的。
- JAVA
- 外部程序以 JAVA 编写。 数据库管理器将调用用户定义的函数作为 Java™ 类中的方法。
- PLI
- 外部程序是用 PL/I 编写的。
- RPG
- 外部程序以 RPG 编写。
- RPGLE
- 外部程序以 ILE RPG 编写。
- 参数样式
- 指定用于将参数传递到函数并从函数返回值的约定:
- DB2GENERAL
- 此参数样式用于指定用于将参数传递到 Java 类中定义为方法的外部函数并从这些函数返回值的约定。 传递所有适用的参数。 参数定义为按以下顺序:
- 前 N 个参数是在 CREATE FUNCTION 语句中指定的输入参数。
- 下一个 M 参数是在 RETURNS TABLE 子句上指定的函数的结果列。
仅当 LANGUAGE 为 JAVA 时,才允许使用 DB2GENERAL 。
- SQL
- 传递所有适用的参数。 参数定义为按以下顺序:
- 前 N 个参数是在 CREATE FUNCTION 语句中指定的输入参数。
- 下一个 M 参数是在 RETURNS TABLE 子句上指定的函数的结果列。
- 输入参数的指示符变量的 n 个参数。
- 在 RETURNS TABLE 子句上指定的函数的结果列的指示符变量的 M 参数
- SQLSTATE 的 CHAR (5) 输出参数。 返回的 SQLSTATE 指示函数成功或失败。 返回的 SQLSTATE 为:
- 来自在外部程序中执行的最后一个 SQL 语句的 SQLSTATE ,
- 由外部程序指定的 SQLSTATE。
用户可以将 SQLSTATE 设置为外部程序中的任何有效值,以从函数返回错误或警告。
- 标准函数名的 VARCHAR (517) 输入参数。
- 特定名称的 VARCHAR (128) 输入参数。
- 消息文本的 VARCHAR (1000) 输出参数。
- 如果在 CREATE FUNCTION 语句上指定了 SCRATCHPAD ,那么是用于暂存区的结构 (由 INTEGER 后跟 CHAR (n)) 输入和输出参数组成。
- 调用类型的 INTEGER 输入参数。
- dbinfo 结构的结构 (如果在 CREATE FUNCTION 语句中指定了 DBINFO)。
请注意,外部函数的语言决定了参数的传递方式。 例如,在 C 中,任何 VARCHAR 或 CHAR 参数都将作为 NUL 终止的字符串传递。 有关更多信息,请参阅 SQL 编程 主题集合。 对于 Java 例程,请参阅 IBM® Developer Kit for Java 主题集合。
- SPECIFIC 具体名称
- 指定函数的唯一名称。 有关特定名称的更多信息,请参阅 CREATE FUNCTION 中为函数指定特定名称。
- 全局确定性 , 语句确定性 或 非确定性
- 指定每次使用相同的输入自变量调用函数时函数是否返回相同的结果。 缺省值为 NOT 确定性。
- NOT DETERMINISTIC
- 指定每次使用相同的输入参数调用函数时,该函数可能不会返回相同的结果。 该函数依赖于一些影响结果的状态值。 数据库管理器在优化 SQL 语句期间使用此信息。 非确定性表函数的一个示例是引用专用寄存器,非确定性函数或以影响表函数结果表的方式的序列。
- 全球确定性
- 指定每次使用相同的输入参数调用函数时,该函数始终返回相同的结果表。 数据库管理器在优化 SQL 语句期间使用此信息。 查询优化器可以选择高速缓存全局确定性函数结果。
- 语句确定性
- 指定每次使用相同的输入自变量调用该函数时,该函数可能不会返回相同的结果,但单个 SQL 语句中对该函数的多次调用被认为是确定性的。 查询优化器将不会对语句确定性函数结果进行高速缓存。1
- CONTAINS SQL , READS SQL DATA , MODISQL DATA , 或 NO SQL
- 指定函数可以执行的 SQL 语句 和嵌套例程 的分类。 数据库管理器将验证函数 发出的 SQL 语句以及函数 本地调用的所有例程是否与此规范一致。 调用嵌套远程例程时,不会执行验证。 有关各语句的分类,请参阅 SQL 语句的特征。 缺省值为 READS SQL DATA。 对于参数缺省表达式,将忽略此选项。
- 读取 SQL 数据
- 指定函数可以执行数据访问分类为 READS SQL DATA , CONTAINS SQL 或 NO SQL 的语句。 该函数无法执行修改数据的 SQL 语句。
- NO SQL
- 指定函数只能执行数据访问分类为 NO SQL 的 SQL 语句。
- 包含 SQL
- 指定函数只能执行数据访问分类为 CONTAINS SQL 或 NO SQL 的 SQL 语句。 该函数无法执行任何读取或修改数据的 SQL 语句。
- 修改 SQL 数据
- 该函数可以执行任何 SQL 语句,但在任何函数中不受支持的语句除外。
- 在空输入上返回空值 或 在空输入上调用
- 指定当任何输入自变量在执行期间为空时是否调用函数。 已在 NULL INPUT 上调用是缺省值。
- RETURNS NULL ON NULL INPUT
- 指定如果任何输入自变量为空,那么不调用该函数。 结果是一个空表,这是一个没有行的表。
- CALLED ON NULL INPUT
- 指定如果任何自变量值为空,那么将调用该函数。 此规范表示必须对函数进行编码以测试空参数值。 此函数可以返回空表,具体取决于其逻辑。
WITHOUT RESTRICT ON DROP or WITH RESTRICT ON DROP or WITH RESTRICT ON DROP INCLUDING EXTERAL PROGRAM
指定是否可以放弃函数。 缺省值为 WITHOUT RESTRICT ON DROP。- 不限制删除
- 指定可以删除该函数。
- 具有对删除的限制
- 指定在除去此属性之前不能删除该函数。
- 对包括外部程序在内的删除操作进行限制
- 指定在除去此属性之前不能删除该函数。

- 继承专用寄存器
- 指定在进入函数时继承专用寄存器的现有值。
- 静态分派
- 指定以静态方式分派函数。 所有功能都以静态方式分派。
- 无 DBINFO 或 DBINFO
- 指定调用函数时是否传递其他状态信息。 缺省值为 NO DBINFO。
- NO DBINFO
- 指定不传递其他信息。
- DBINFO
- 指定数据库管理器应将包含状态信息的结构传递给函数。 表 1 包含 DBINFO 结构的描述。 可在库 QSYSINC 中相应源文件的 sqludf 中找到有关 DBINFO 结构的详细信息。 例如,对于 C ,可以在 QSYSINC/H 中找到 sqludf。
表 1. DBINFO 字段 字段 数据类型 描述 关系数据库 VARCHAR(128) 当前服务器的名称。 授权标识 VARCHAR(128) 运行时授权标识。 CCSID 信息 INTEGER
INTEGER
整数INTEGER
INTEGER
整数INTEGER
INTEGER
整数INTEGERCHAR(8)作业的 CCSID 信息。 返回三组三个 CCSID。 以下信息标识每个集合中的三个 CCSID: - SBCS CCSID
- DBCS CCSID
- 混合 CCSID
每组 CCSID 都用于不同的编码方案 (EBCDIC , ASCII 和 Unicode)。
如果未对 CREATE FUNCTION 语句上的参数显式指定 CCSID ,那么假定输入字符串在执行函数时以作业的 CCSID 编码。 如果输入字符串的 CCSID 与参数的 CCSID 不同,那么在调用外部程序之前将转换传递到外部函数的输入字符串。
目标列 VARCHAR(128) VARCHAR(128)VARCHAR(128)如果在 UPDATE 语句中 SET 子句的右侧指定了用户定义的函数,那么以下信息将标识目标列: - 模式名称
- 基本表名
- 列名
版本和发行版 CHAR(8) 数据库管理器的版本,发行版和修改级别。 平台 INTEGER 服务器的平台类型。 表函数列列表条目数 SMALLINT 下面 "表函数列列表" 字段中指定的表函数列列表中的非零条目数。 保留 CHAR (24) 保留以供将来使用。 表函数列列表 指针 (16 字节) 此字段是指向数据库管理器动态分配的短整数数组的指针。 只有前 n 个条目 (其中 n 在 "表函数列列表条目数" 字段中指定) 是感兴趣的, n 可以等于 0 ,并且小于或等于在 RETURNS TABLE 子句中为函数定义的结果列数。 这些值对应于此语句从表函数中需要的列的序数。 值 1 表示第一个定义的结果列, 2 表示第二个定义的结果列,依此类推。 这些值可以按任何顺序排列。 请注意,对于类似于 SELECT COUNT (*) FROM TABLE (TF (...)) AS QQ 的语句, n 可能等于零,其中查询不需要实际列值。 此数组表示优化机会。 函数不需要返回表函数的所有结果列的所有值。 在特定上下文中可能只需要值的子集,而这些是数组中标识的列 (按数字)。 由于此优化可能会使函数逻辑复杂化,因此函数可以选择返回每个定义的列。
- 外部操作 或 无外部操作
- 指定函数是否执行操作来更改数据库管理器不管理的对象的状态。 外部操作的一个示例是发送消息或将记录写入流文件。 缺省值为 EXTERNAL ACTION。
- EXTERNAL ACTION
- 指定函数可以执行更改数据库管理器不管理的对象的状态的操作。 因此,必须使用每个连续的函数调用来调用该函数。 如果函数包含对具有外部操作的另一个例程的引用,那么应指定 EXTERNAL ACTION。
- NO EXTERNAL ACTION
- 该函数不会执行外部操作。 不需要使用每个连续的函数调用来调用该函数。
NO EXTERNAL ACTION 函数的性能可能优于 EXTERNAL ACTION 函数,因为对于每个连续的函数调用,都可能不会调用这些函数。
- 受防护 或 未受防护
- 指定外部函数是否在与数据库管理器环境隔离的环境中运行。 FENCED 是缺省值。
- FENCED
- 该函数将在单独的线程中运行。
FENCED 函数无法在对该函数的个别调用中保持 SQL 游标处于打开状态。 但是,一个线程中的游标独立于任何其他线程中的游标,这会降低游标名称冲突的可能性。
- NOT FENCED
- 该函数可以在与调用 SQL 语句相同的线程中运行。
NOT FENCED 函数可以使 SQL 游标在对该函数的各个调用中保持打开状态。 由于游标可以保持打开状态,因此在对函数的调用之间也将保留光标位置。 但是,由于 UDF 现在与调用 SQL 语句和其他 NOT FENCED UDF 在同一线程中运行,因此游标名可能会发生冲突。
NOT FENCED 函数的性能通常优于 FENCED 函数。
- PROGRAM TYPE MAIN 或 PROGRAM TYPE SUB
- 允许此参数与其他产品兼容。 它指示例程的外部程序是程序 (*PGM) 还是服务程序 (*SRVPGM) 中的过程。
- PROGRAM TYPE MAIN
- 指定例程作为程序中的主入口点执行。 外部程序必须是 *PGM 对象。
- PROGRAM TYPE SUB
- 指定例程作为服务程序中的过程执行。 外部程序必须是 *SRVPGM 对象。
- 无最终调用 或 最终调用
- 指定是否对函数进行单独的 第一次调用 和 最终调用 。 为了区分调用类型,该函数会接收指定调用类型的附加参数。 对于表函数, call-type 自变量始终存在 (无论 FINAL CALL 或 NO FINAL CALL 是否生效) ,它指示第一次调用,打开调用,访存调用,关闭调用或最终调用。
使用 NO FINAL CALL 时,数据库管理器将仅对表函数进行三种类型的调用 :open , fetch 和 close。 但是,如果指定了 FINAL CALL ,那么除了打开,访存和关闭外,还可以对表函数进行第一次调用和最后一次调用。
最终调用使该函数能够释放它已获取的任何系统资源。 当使用 SCRATCHPAD 关键字定义函数并且该函数获取系统资源并将其存储在暂存区中时,最终调用很有用。 缺省值为 NO FINAL CALL。
- NO FINAL CALL
- 指定不对函数进行单独的第一次调用和最后一次调用。 但是,仍会对该函数进行 open , fetch 和 close 调用,并且表函数始终接收指定调用类型的附加自变量。
- FINAL CALL
- 指定对函数进行单独的第一次调用和最后一次调用。 它还控制何时重新初始化暂存区。
调用类型为:
- FIRST 调用
- 指定此 SQL 语句中函数的此引用的第一个函数调用。
- OPEN 调用
- 指定调用以在此 SQL 语句中打开表函数结果。
- FETCH 调用
- 指定在此 SQL 语句中从表函数访存行的调用。
- CLOSE 调用
- 指定用于在此 SQL 语句中关闭表函数结果的调用。
- FINAL CALL
- 指定对该函数的最后一次调用,以使该函数能够释放资源。 如果发生错误,那么数据库管理器将尝试进行最终调用。
最终调用在以下时间发生:
- 语句结束: 当针对面向游标的语句关闭游标时,或语句的执行已完成时。
- 事务结束: 当未发生正常的语句结束处理时。 例如,由于某种原因,应用程序的逻辑会绕过关闭游标。
如果在定义为 WITH HOLD 的游标打开时发生落实操作,那么将在游标关闭或应用程序结束时进行最终调用。
在 FINAL CALL 期间不应执行可落实操作,因为在 COMMIT 操作中调用 CLOSE 期间可能会发生 FINAL CALL。
- 允许并行 或 不允许并行
- 指定是否可以并行运行函数。
如果指定了以下一个或多个子句,那么缺省值为 DISALLOW PARALLEL: 非确定性,外部操作,最终调用,修改 SQL 数据或 SCRATCHPAD。 否则,缺省值为 ALLOW PARALLEL。
- ALLOW PARALLEL
- 指定数据库管理器可以考虑函数的并行性。 数据库管理器不需要对调用该函数的 SQL 语句或从该函数中发出的任何 SQL 语句使用并行性。
请参阅 "非确定性" , "外部操作" , "修改 SQL 数据" , "SCRATCHPAD" 和 "最终调用" 的描述,以了解适用于 ALLOW PARALLEL 规范的注意事项。
- DISALLOW PARALLEL
- 指定数据库管理器不得对该函数使用并行性。
- 无 SCRATCHPAD 或 SCRATCHPAD
- 指定函数是否需要静态内存区。
- 无 SCRATCHPAD
- 指定函数不需要持久内存区域。
- SCRATCHPAD 整数
- 指定函数需要长度为整数的持久内存区域。 整数的范围可以从 1 到 16,000,000。 如果未指定内存区域,那么该区域的大小为 100 字节。 如果指定了参数样式 SQL ,那么将在指向静态存储区的必需参数之后传递指针。 将仅为该函数分配 1 内存区域。暂存区的作用域是 SQL 语句。 对于 SQL 语句中的函数的每个引用,都有一个暂存区。 例如,假定函数 UDFX 是使用 SCRATCHPAD 关键字定义的,那么将在以下 SQL 语句中为 UDFX 的两个引用分配两个暂存区:
SELECT A.C1, B.C1 FROM TABLE(UDFX(:hv1)) AS A, TABLE(UDFX(:hv1)) AS B
- EXTERNAL
- 指定正在使用 CREATE FUNCTION 语句来定义基于以外部编程语言编写的代码的新函数。
如果未指定 external-program-name ,那么假定外部程序名与函数名相同。
- NAME 外部程序名称
- 指定在 SQL 语句中调用函数时将执行的程序,服务程序或 Java 类。 该名称必须标识在调用函数时存在于应用程序服务器上的程序,服务程序或 Java 类。 如果命名选项是 *SYS 并且名称未限定:
- 当前路径将用于在调用函数时搜索程序。
- *LIBL 将用于在对函数执行 COMMENT , GRANT , LABEL 或 REVOKE 操作时搜索程序或服务程序。
将在应用程序服务器上检查名称的有效性。 如果名称的格式不正确,那么将返回错误。
程序,服务程序或 Java 类在创建函数时不需要存在,但在调用函数时必须存在。
在函数的外部程序中不允许 CONNECT , SET CONNECTION , RELEASE , DISCONNECT , COMMIT , ROLLBACK 和 SET TRANSACTION 语句。
- 卡位值 bigint
- 指定要由函数返回的期望行数的估计值,以供数据库管理器在优化期间使用。 bigint 必须在 0 到 9 223 372 036 854 775 807 (含) 的范围内。 如果未指定 CARDINALITY ,那么数据库管理器将采用有限值。
每次调用行时返回行且从不返回表结束条件的表函数具有无限基数。 调用此类函数并需要最终结束表条件才能返回任何数据的查询将不会返回,除非中断。 从不返回表结束条件的表函数不应用于涉及 DISTINCT , GROUP BY 或 ORDER BY 的查询。
- 不受保护 或 受保护
- 指定对于行访问控制和列访问控制,是否认为该函数是安全的。
- 不安全
- 指定对于行访问控制和列访问控制,该函数被视为不安全。 这是缺省情况。
- SECURED
- 指定对于行访问控制和列访问控制,该函数被认为是安全的。 该选项可用于用 C、C++、ILE RPG、ILE COBOL、ILE CL 或 Java 编写的外部函数。 当执行 CREATE FUNCTION 语句时,程序或服务程序必须存在。
- SET OPTION-语句
- 指定将使用参数缺省值的选项。 选项的缺省值取决于创建时生效的选项。 有关更多信息,请参阅 SET OPTION。
处理缺省值表达式时使用以下选项 :ALWCPYCTA , CONACC , DATFMT , DATSEP , DECFLTRND ,DECMP, DECRESULT , DFTRDBCOL , LANGID , SQLCURRULE , SQLPATH , SRTSEQ , TGTRLS , TIMFMT 和 TIMSEP。 在 CREATE FUNCTION 语句中不允许使用选项 CNULRQD , CNULIGN , COMPILEOPT , EXTIND , AMING 和 SQLCA。 已接受其他选项,但将忽略这些选项。
注意
定义用户定义函数的一般注意事项:有关定义用户定义函数的一般信息,请参阅 CREATE FUNCTION。
- 将废弃任何现有注释或标签。
- 如果指定了其他外部程序:
- 授权用户不会复制到新营销计划。
- 未更改日志审计。
- 否则,执行以下操作:
- 维护授权用户。 对象所有者将不会更改。
- 当前日志审计未更改。
创建函数: 创建与 ILE 外部程序或服务程序相关联的外部函数时,会尝试将该函数的属性保存在相关联的程序或服务程序对象中。 如果保存了 *PGM 或 *SRVPGM 对象,然后将其恢复到此系统或其他系统,那么将使用这些属性来更新目录。
可以保存受以下限制的外部函数的属性:
- 外部程序库不能是 SYSIBM , QSYS 或 QSYS2。
- 发出 CREATE FUNCTION 语句时,外部程序必须存在。
如果指定了系统命名并且未限定外部程序名,那么必须在库列表中找到外部程序。
- 外部程序必须是 ILE *PGM 或 *SRVPGM 对象。
如果无法更新该对象,那么仍将创建该函数。
如果在 QTEMP 中创建了外部函数,那么在作业结束时不会除去目录信息。
调用函数: 调用外部函数时,它将在创建外部程序或服务程序时指定的任何激活组中运行。 但是,通常应该使用 ACTGRP (*CALLER) ,以便该函数在与调用程序相同的激活组中运行。 不允许 ACTGRP (*NEW)。
LANGUAGE JAVA 函数始终在缺省激活组 (*DFTACTGRP) 中运行。 编写 MODISQL DATA Java 函数时应谨慎使用。 由于 Java 函数执行的更改是在缺省激活组中执行的,因此如果调用者在新的激活组 (*NEW) 中运行,那么可能会发生事务问题。
EXTERNAL ACTION 函数: 在包含其他表引用的查询中调用 EXTERNAL ACTION 表函数时,表函数相对于连接或搜索条件的应用程序的调用可能不可预测。 调用该函数的次数以及调用该函数的顺序相对于查询中的其他处理可能因所使用的存取方案而异。
Java 函数 Notes: 要能够运行 Java 函数, 您必须在系统上安装 IBM IBM Developer Kit for Java (5770-JV1)。 否则,将返回 SQLCODE -443 ,并将在作业记录中放入 CPDB521 消息。
如果运行 Java 函数时发生错误,那么将返回 SQLCODE -443。 根据错误,在运行函数的作业的作业记录中可能存在其他消息。
语法替代方法: 以下关键字是支持与先前发行版兼容的同义词。 这些关键字是非标准的,不应使用:
- 关键字 VARIANT 和 NOT VARIANT 可用作 NOT 确定性和确定性的同义词。
- 关键字 NULL CALL 和 NOT NULL CALL 可用作 CALL ON NULL INPUT 和 RETURNS NULL ON NULL INPUT 的同义词。
- 值 DB2GENRL 可用作 DB2GENERAL的同义词。
- PARAMETER STYLE 子句中的关键字 PARAMETER STYLE 是可选的。
- 关键字 IS 确定性可用作确定性的同义词。
- 关键字 PARAMETER STYLE $TAG1 DB2SQL $TAG2 可用作 PARAMETER STYLE SQL 的同义词。
示例
以下创建一个表函数,该表函数用于返回由文本管理系统中每个已知文档的单个文档标识列组成的行。 第一个参数与给定的主题区域匹配,第二个参数包含给定的字符串。
在单个会话的上下文中, UDF 将始终返回同一个表,因此它定义为确定性。 请注意用于定义 DOCMATCH 的输出的 RETURNS 子句。 必须为每个表函数指定 FINAL CALL。 虽然 DOCMATCH 的输出大小是高度可变的,但 CARDINALITY 20 是一个代表值,并且指定它是为了帮助优化器。
CREATE FUNCTION DOCMATCH (VARCHAR(30), VARCHAR(255))
RETURNS TABLE (DOCID CHAR(16))
EXTERNAL NAME 'MYLIB/RAJIV(UDFMATCH)'
LANGUAGE C
PARAMETER STYLE SQL
NO SQL
DETERMINISTIC
NO EXTERNAL ACTION
NOT FENCED
SCRATCHPAD
FINAL CALL
DISALLOW PARALLEL
CARDINALITY 20