CREATE FUNCTION 语句(外部表函数)

CREATE FUNCTION 语句用于在数据库服务器中注册用户定义的外部表函数。 用户定义的外部表函数可用于子查询的 FROM 子句中。 子选择每次调用时都会返回一行,从而返回一个表。

CREATE FUNCTION(外部表)调用

此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL

CREATE FUNCTION(外部表)授权

以下定义的特权必须至少包含以下一项:

  • 模式中的CREATEIN特权
  • SYSADM 或 SYSCTRL 权限
  • 系统 DBADM
  • 更改开始安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)更改结束

与模式名称匹配的授权ID隐式拥有该模式的CREATEIN权限。

更改开始如果用于创建函数的授权ID具有安装SYSADM权限或安装SYSOPR权限,并且当前SQLID设置为SYSINSTL,则该函数被标识为系统定义的函数。更改结束

如果函数使用表作为参数、引用不同类型或在WLM(工作负载管理器)环境中运行,则需要额外的权限。 这些特权包括:

  • SELECT权限,任何表都是函数的输入参数。
  • 函数所引用的每个不同类型的USAGE权限。
  • 在指定的WLM环境中创建程序的权限。 该授权来自外部安全产品,例如 RACF®。

如果指定了 SECURED 选项,则至少需要以下一项附加权限:

  • SECADM 权限
  • CREATE_SECURE_OBJECT权限

权限设置:

如果语句嵌入到应用程序中,权限集就是计划或软件包所有者所拥有的权限。 如果所有者是一个角色,则隐式模式匹配不适用,该角色需要包含前面列出的条件之一。

如果语句动态生成,且未在指定了 ROLE AS OBJECT OWNER 子句的可信环境中运行,则权限集是指进程的 SQL 授权 ID 所拥有的权限集。 如果架构名称与进程的SQL授权ID不同,则必须满足以下条件之一:

  • 特权集包括SYSADM或SYSCTRL权限。
  • 该进程的SQL授权ID对模式具有CREATEIN权限。

CREATE FUNCTION(外部表)的语法

阅读语法图跳过可视化语法图CREATE FUNCTION功能名称( ,parameter-declaration ) RETURNS TABLE(,列名数据类型AS LOCATOR1)GENERIC TABLE2 option-list
注意:
  • 1 AS LOCATOR只能指定为LOB数据类型或基于LOB数据类型的不同类型。
  • 2 本条款和选项列表中的后续条款可以以任何顺序排列。

参数声明:

阅读语法图跳过可视化语法图parameter-name参数类型

参数类型:

阅读语法图跳过可视化语法图数据类型AS LOCATOR1TABLE LIKEtable-name视图名称AS LOCATOR
注意:
  • 1 AS LOCATOR只能指定为LOB数据类型或基于LOB数据类型的不同类型。

数据类型:

阅读语法图跳过可视化语法图built-in-type独特类型名称

内置类型:

阅读语法图跳过可视化语法图SMALLINTINTEGERINTBIGINTDECIMALDECNUMERIC(5,0)( 整数整数)FLOAT(53)( 整数)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( 整数)CHARACTERCHARVARYINGVARCHAR( 整数)CCSIDASCIIEBCDICUNICODEFORSBCSMIXEDBITDATACHARACTERCHARLARGE OBJECTCLOB(1M)( 整数KMG)CCSIDASCIIEBCDICUNICODEFORSBCSMIXEDDATAGRAPHIC(1)( 整数)VARGRAPHIC(整数)DBCLOB(1M)( 整数KMG)CCSIDASCIIEBCDICUNICODEBINARY(1)( 整数)BINARY VARYINGVARBINARY( 整数)BINARY LARGE OBJECTBLOB(1M)( 整数KMG)DATETIMETIMESTAMP(6)(整数)WITHOUT TIME ZONEWITH TIME ZONEROWID

选项列表 :(选项列表中的条款可以以任何顺序指定。)

阅读语法图跳过可视化语法图SPECIFIC专有名词PARAMETER1CCSIDASCIIEBCDICUNICODEVARCHARNULTERMSTRUCTUREEXTERNAL NAME字符串标识 LANGUAGE ASSEMBLECCOBOLPLI PARAMETER STYLE SQLNOT DETERMINISTICDETERMINISTICFENCEDRETURNS NULL ON NULL INPUTCALLED ON NULL INPUTREADS SQL DATACONTAINS SQLNO SQLEXTERNAL ACTIONNO EXTERNAL ACTIONNO PACKAGE PATHPACKAGE PATH包路径NO SCRATCHPADSCRATCHPAD100长度NO FINAL CALLFINAL CALLDISALLOW PARALLELNO DBINFODBINFOCARDINALITY整数NO COLLIDCOLLID收藏-IDWLM ENVIRONMENT名称( 名称)ASUTIME NO LIMITASUTIMELIMIT整数STAY RESIDENT NOSTAY RESIDENT YESPROGRAM TYPE SUBPROGRAM TYPE MAINSECURITY DB2SECURITYUSERDEFINERRUN OPTIONS运行时选项INHERIT SPECIAL REGISTERSDEFAULT SPECIAL REGISTERSSTATIC DISPATCHSTOP AFTER SYSTEM DEFAULT FAILURESSTOP AFTER整数FAILURESCONTINUE AFTER FAILURENOT SECUREDSECURED
注意:
  • 1 同一条款不得重复出现。

CREATE FUNCTION(外部表)描述

功能名称
命名用户定义的函数。 名称由模式名隐式或显式限定。 更多信息,请参阅 CREATE FUNCTION语句(概述 )中的选择架构和函数名称以及确定架构中函数的唯一性
(参数声明 ……)
确定函数的输入参数数量,并指定每个参数的数据类型。 函数的全部参数均为输入参数,且可为空。 函数期望接收的每个参数列表中必须有一个条目。 虽然不是必需的,但您可以为每个参数命名。
一个函数可以没有参数。 在这种情况下,您必须编写一组空括号,例如:
    CREATE FUNCTION WOOFER()
参数名称
指定输入参数的名称。 该名称是SQL标识符,参数列表中的每个名称不得与其他名称相同。 参数名和列名不能使用相同的名称。
data-type
指定输入参数的数据类型。 数据类型可以是内置数据类型,也可以是用户定义的独特类型。
内置式
输入参数的数据类型是内置数据类型。 有关内置数据类型的说明,请参阅 CREATE TABLE 语句中的数据类型built-in-type 的说明。

对于字符或图形数据类型的参数,PARAMETER CCSID子句或CCSID子句指示参数的编码方案。 如果您没有指定这两个条款中的任何一个,编码方案就是安装面板 DSNTIPF 上的字段 DEF ENCODING SCHEME 的值。

distinct-type-name
输入参数的数据类型是不同的类型。 参数的任何长度、精度、比例、子类型或编码方案属性都是不同类型的源类型属性。

如果您指定了不同类型的名称而没有模式名称, Db2 将通过在SQL路径中搜索模式来解析模式名称。

虽然字符数据类型的参数具有隐式或显式指定的子类型(BIT、SBCS或MIXED),但函数程序可以接收任何子类型的字符数据。 因此,在调用函数时,输入数据可能会转换为参数的子类型。 如果将实际包含DBCS字符的混合数据用作SBCS子类型声明的输入参数的值,则会发生错误。

日期时间数据类型或不同类型的参数将以不同数据类型的形式传递给函数:

  • 日期时间类型参数以字符数据类型传递,数据以ISO格式传递。

    日期时间类型参数的编码方案与任何字符或图形字符串参数的隐式或显式编码方案相同。 如果没有传递字符串或图形字符串参数,则编码方案为安装面板 DSNTIPF 上的字段 DEF ENCODING SCHEME 的值。

  • 一个不同的类型参数作为不同类型的源类型传递。
AS LOCATOR
指定将参数值的定位器传递给函数,而不是实际值。 仅对具有LOB数据类型或基于LOB数据类型的独特类型的参数指定AS LOCATOR。 传递定位符而不是值可以减少传递给函数的字节数,特别是当参数值非常大时。

AS LOCATOR子句对确定数据类型是否可以提升没有影响,对函数解析中使用的函数签名也没有影响。

TABLE LIKE 表名视图名 AS LOCATOR
指定参数为转换表。 然而,当函数被调用时,转换表中的实际值不会传递给函数。 而是传递一个单一的值。 这个单一值是表的定位符,函数使用它来访问转换表的列。 带表参数的函数只能从触发器的触发操作中调用。

使用 TABLE LIKE 隐式定义了转换表。 它规定转换表的列数与已识别表或视图的列数相同。 如果指定了表格,则转换表格中包含定义为隐式隐藏的列。 列具有与已识别表或视图相同的数据类型、长度、精度、比例、子类型和编码方案,如目录表 SYSCOLUMNS 和 SYSTABLESPACE 中所述。 列的数量和属性在处理CREATE FUNCTION语句时确定。 随后对表格中列的数量或列的属性所做的任何更改都不会影响函数的参数。

表名视图名必须标识当前服务器上存在的表或视图。 视图的长度不能为0。 名称不得用于已声明的临时表。 已标识的表可以包含XML列,但函数不能引用这些XML列。 名称不必与触发器转换表关联的表名称相同。 根据以下规则,未限定的表名或视图名将被隐式限定:

  • 如果CREATE FUNCTION语句嵌入在程序中,则隐式限定符是QUALIFIER绑定选项中创建或最近重新编译计划或包时的授权ID。 如果没有使用限定词,则隐含限定词为计划或套餐的所有者。
  • 如果CREATE FUNCTION语句是动态准备的,则隐式限定符是CURRENT SCHEMA特殊寄存器中的SQL授权ID。

当调用该函数时,由表定位符标识的转换表的相应列与TABLE LIKE子句中标识的表或视图必须具有相同的定义。 这些列的数据类型、长度、精度、比例和编码方案必须完全匹配。 使用CREATE FUNCTION语句执行时对表或视图的描述。

此外,如果定义时指定的表对应列未定义为字符型 FOR BIT DATA,则不能将转换表中的字符型 FOR BIT DATA 列作为表参数的输入。 (定义出现在CREATE FUNCTION语句中。) 同样,如果转换表的某列不是“FOR BIT DATA”,则不能将其作为输入传递给定义时指定为“FOR BIT DATA”的表参数的对应列。

有关使用表格定位器的更多信息,请参阅在用户定义的函数或存储过程中访问转换表

返回表 (列名 、数据类型 ……)
确定函数的输出是一个表格。 关键字后面的括号中包含表格列的名称和数据类型列表。
列名
指定列的名称。 该名称是SQL标识符,在函数的RETURNS TABLE子句中必须唯一。
data-type
指定列的数据类型。 该列为空。
AS LOCATOR
指定函数返回一个值定位器,而不是实际值。 您只能为LOB数据类型或基于LOB数据类型的不同类型指定AS LOCATOR。
RETURNS GENERIC TABLE
指定函数的输出是一个通用表。 仅当指定了语言C时,才能指定此选项。

当使用子查询的类型相关子句引用表函数时,必须声明列的名称和数据类型。

更多信息,请参阅类型相关子句

SPEC IFIC 特定名称
指定函数的唯一名称。 名称隐含或明确地带有模式名称。 名称(包括架构名称)不得与当前服务器上存在的其他函数的特定名称相同。

非限定格式的 specific-name 是 SQL 标识。 合格的形式是SQL标识符(模式名称)后跟一个句点和SQL标识符。

如果未指定模式名称,则与函数名称 (function-name) 的显式或隐式模式名称相同。 如果指定模式名称,则该名称必须与函数名称的显式或隐式模式名称相同。

如果您没有指定SPECIFIC子句,则默认的特定名称就是函数的名称。 但是,如果函数名称没有提供唯一的特定名称,或者函数名称只有一个星号,则 Db2 会以如下形式生成特定名称:
SQLxxxxxxxxxxxx
其中, 'xxxxxxxxxxxx' 是一串12个字符,用于确保名称的唯一性。

具体名称存储在SYSROUTINES目录表的SPECIFIC列中。 在多个SQL语句(如ALTER FUNCTION、COMMENT、DROP、GRANT和REVOKE)和 Db2 命令(START FUNCTION、STOP FUNCTION和DISPLAY FUNCTION)中,特定名称可用于唯一标识函数。 但是,不能通过其特定名称来调用该函数。

参数 CCSID 或 VARCHAR
CCSID
指示字符或图形字符串参数 的编码方案是ASCII、EBCDIC还是UNICODE。 默认编码方案是参数列表或返回表子句中的CCSID子句或安装面板DSNTIPF中的DEF ENCODING SCHEME字段中指定的值。

该条款为指定字符或图形字符串参数的编码方案提供了便利。 如果除了此 PARAMETER CCSID 子句之外,还为各个参数指定了各个 CCSID 子句, 则所有 CCSID 子句中指定的值必须与此子句中指定的值相同。

该条款还规定了系统生成的常规参数(如消息标记和DBINFO)所使用的编码方案。

VARCHAR
指定不同长度字符串参数的值的表示形式,包括(如果适用)指定 LANGUAGE C 的函数的输出。

仅当指定了语言C时,才能指定此选项。

无效
指定可变长度字符串参数以NUL字符结尾的字符串形式表示。
结构
指定可变长度字符串参数以VARCHAR结构形式表示。

使用参数VARCHAR子句时,无法像使用参数CCSID子句那样指定单个参数的VARCHAR形式。 PARAMETER VARCHAR子句仅适用于函数参数列表中的参数和RETURNS TABLE子句中的参数。 它不适用于系统生成的常规参数,例如消息标记和DBINFO。

在数据共享环境中,除非数据共享组的所有成员都支持参数VARCHAR子句,否则不应指定该子句。 如果某些组成员支持此条款,而其他成员不支持,并且外部例程中指定了参数 VARCHAR,则该例程将遇到不同的参数形式,具体取决于调用该例程的组成员。

EXTERNAL
指定正在注册的函数基于用外部编程语言编写的代码,并遵守该语言的文档化链接约定和接口。

如果未指定 NAME 子句,则隐式使用“NAME 函数名 ”。 在这种情况下, 函数名称不能超过8个字符。

名称字符串标识符
标识包含用户编写代码的加载模块的名称,该代码用于实现功能的逻辑。

对于LANGUAGE的其他值,名称可以是长度不超过8个字符的字符串常量。 它必须符合负载模块的命名规则。 国家语言的字母扩展名可用作加载模块名称中的第一个字符和后续字符。

Db2 当函数被调用时,加载负载模块。 当包含函数体的程序被编译和链接编辑时,负载模块便创建完成。 执行CREATE FUNCTION语句时,无需加载模块。 但是,当调用该功能时,它必须存在且当前服务器可以访问。

您可以通过以下方式之一指定EXTERNAL子句:
  EXTERNAL
  EXTERNAL NAME PKJVSP1
  EXTERNAL NAME 'PKJVSP1'
如果指定外部程序名称,则必须使用 NAME 关键字。 例如,以下语法无效:
  EXTERNAL PKJVSP1
中文
指定编写函数程序所用的应用程序编程语言。 所有程序必须能在 IBM® 的 Language Environment® 环境中运行。
汇编
该功能是用汇编语言编写的。
C
函数用C或C++编写。只有在指定了LANGUAGE C的情况下才能指定VARCHAR子句。
COBOL
该函数使用 COBOL 编写,包括面向对象语言扩展。
PLI
该函数以 PL/I 编写。
PARAMETER STYLE SQL
指定函数程序用于从调用SQL语句接收输入参数并将返回值传递给调用SQL语句的链接约定。

参数风格 SQL 指定了参数传递约定,支持将空值作为输入和输出。

如果指定了 RETURNS TABLE 子句,则在调用 SQL 语句和函数之间传递的参数包括:
  • 为函数指定的输入参数的n个参数
  • 在 RETURNS TABLE 子句中指定的函数结果列的 m 个参数
  • 输入参数的指标变量的 n个参数
  • 在 RETURNS TABLE 子句中指定的函数结果列的指标变量的 m 个参数
  • 要返回的SQLSTATE为 Db2
  • 函数的限定名称
  • 功能的特定名称
  • 要返回的SQL诊断字符串 Db2
  • 如果指定了SCRATCHPAD,则使用SCRATCHPAD
  • 呼叫类型
  • 如果指定了DBINFO,则DBINFO结构
如果指定了 RETURNS GENERIC TABLE 子句,则在调用 SQL 语句和函数之间传递的参数包括:
  • 为函数指定的输入参数的n个参数
  • 输入参数的指标变量的 n个参数
  • 在 RETURNS GENERIC TABLE 子句中指定的函数结果列的 m 个参数
  • 结果表描述符包含以下内容:
    • SELECT语句中表函数引用的 类型相关子句中指定的函数中的m个结果列
    • 一系列m ,4字节地址,指向结果列的值
    • 结果列中一系列m、null指示符
  • 要返回的SQLSTATE为 Db2
  • 函数的限定名称
  • 功能的特定名称
  • 要返回的SQL诊断字符串 Db2
  • 如果指定了SCRATCHPAD,则使用SCRATCHPAD
  • 呼叫类型
  • 如果指定了DBINFO,则DBINFO结构

有关传递的参数列表结构的完整信息,请参阅 DBINFO结构

非确定性确定性
指定函数是否每次在相同的输入参数下调用时返回相同的结果。
NOT DETERMINISTIC
当使用相同的输入参数调用该函数时,每次返回的结果可能不同。 函数取决于一些影响结果的状态值。 Db2 在处理引用此函数的 SELECT 和 SQL 数据更改语句时,使用此信息来禁止合并视图和表表达式。 非确定性函数的一个例子是生成随机数的函数,或者任何包含SQL语句的函数。

默认值为“非确定性”。

DETERMINISTIC
每次调用函数时,如果输入参数相同,则函数返回的结果始终相同。 确定性函数的例子是计算输入的平方根的函数。 Db2 使用这些信息合并引用此函数的 SELECT 和 SQL 数据更改语句的视图和表表达式。 “决定论”并非默认选项。 如果适用,请指定“确定性”,以防止为引用此函数的 SQL 语句选择非最佳访问路径。

Db2 不验证功能程序是否符合确定性或非确定性的规范。

FENCED
指定函数在外部地址空间运行,以防止函数损坏 Db2 存储。

默认值为FENCED。

在输入为空调用输入为空时返回空
指定当任何输入自变量在执行期间为空时是否调用函数。
RETURNS NULL ON NULL INPUT
如果任何输入参数为空,则不会调用该函数。 结果是一张空桌子,即没有行的桌子。 默认值为输入无效。
CALLED ON NULL INPUT
无论输入参数是否为空,都会调用该函数,因此该函数负责检测参数是否为空。 根据其逻辑,该函数可能会返回一个空表。
SQL数据、包含SQL 不含SQL
指定此例程可以执行或调用的SQL语句和嵌套例程的分类。 数据库管理员负责验证函数发出的SQL语句以及本地调用的所有例程是否符合规范;当调用嵌套的远程例程时,不会进行验证。 有关每条语句的分类,请参阅例程的SQL语句数据访问分类
READS SQL DATA
指定函数可以执行带有数据访问指示的语句,包括READS SQL DATA、CONTAINS SQL或NO SQL。 该功能无法执行修改数据的SQL语句。
CONTAINS SQL
指定函数只能执行访问指示为CONTAINS SQL或NO SQL的SQL语句。 该函数不能执行读取或修改数据的语句。
NO SQL
指定函数只能执行数据访问分类为“非 SQL”的 SQL 语句。
EXTERNAL ACTION NO EXTERNAL ACTION
指定函数是否执行操作,以改变 Db2 不管理的对象的状态。 外部操作的一个示例是发送消息或将记录写入文件。

由于 Db2 使用RRS附件的功能, Db2 可以与任何其他使用RRS的资源管理器一起参与两阶段提交。 对于不使用RRS的资源管理器,非Db2 资源上的提交或回滚操作没有协调。

EXTERNAL ACTION
该函数可以采取行动,改变 Db2 不管理的对象的状态。

如果您指定外部操作, Db2

  • 在引用函数的SELECT和SQL数据更改语句中实现视图和表表达式。 这种具体化可能会对引用该函数的SQL语句的访问路径产生不利影响。 如果功能没有外部动作,请不要指定外部动作。
  • 在FETCH操作之间,不会将功能从一个任务控制块(TCB)移动到另一个任务控制块。
  • 在关闭光标之前,不允许其他函数或存储过程使用TCB。 这也适用于被声明为“保留”的游标。

Db2 之外,资源所做的唯一改变是在提交和回滚操作的控制下,在RRS控制下所做的那些改变。

默认情况下,外部操作处于启用状态。

NO EXTERNAL ACTION
该函数不会采取任何行动来改变 Db2 不管理的对象的状态。 Db2 使用这些信息合并引用此函数的 SELECT 和 SQL 数据更改语句的视图和表表达式。 如果适用,请指定“无外部操作”,以防止为引用此函数的 SQL 语句选择非最佳访问路径。

虽然全局变量的范围超出了常规,但在指定了“无外部操作”时,可以在常规主体中设置全局变量。

没有包路径包路径包路径
指定运行函数时使用的包路径。 这是与功能相关的DBRM可能关联的包集合列表。
无包路径
指定函数的包集合列表与调用函数的程序的包集合ID列表相同。 如果调用函数的程序不使用包,则 Db2 会依次使用CURRENT PACKAGE PATH特殊寄存器、CURRENT PACKAGESET特殊寄存器或PKLIST绑定选项(按此顺序)来解析包。 有关 Db2 如何使用这三项的信息,请参阅绑定申请计划
软件包路径 package-path
指定一个包集合列表,格式与SET CURRENT PACKAGE PATH特殊寄存器相同。

如果COLLID子句与PACKAGE PATH一起指定,则在调用函数时,COLLID子句将被忽略。

当函数被调用时,会检查创建函数时提供的包路径值。 如果包路径包含 SESSION_USER(或 USER)、PATH 或 PACKAGE PATH,则在检查包路径值时返回错误。

无划痕板划痕板
指定 Db2 是否为该函数提供临时存储区。 强烈建议功能可重入,并且使用临时存储器为功能提供区域,以便在调用之间保存信息。
NO SCRATCHPAD
指定不分配临时存储器并将其传递给函数。 默认设置是“无便笺”。
记事本长度
指定当函数首次调用时, Db2 会为临时存储分配内存。 记事本具有以下特点:
  • 长度必须在1-32767之间。 默认值为100字节。
  • Db2 将暂存器初始化为全二进制零 (X'00''s )。
  • 临时存储器的范围是SQL语句。 SQL语句中每个函数引用都有一个临时存储区。 例如,假设函数UDFX是用SCRATCHPAD关键字定义的,则在以下SQL语句中,两个对UDFX的引用将分配到两个临时表中:
        SELECT *
        FROM TABLE (UDFX(A)), TABLE (UDFX(B));
  • 临时记事本会一直保留。 Db2 在函数调用之间保持其内容不变。 功能对一次通话中的记事本所做的任何更改,在下次通话中仍然存在。 Db2 在开始执行SQL语句时初始化临时存储区。 Db2 当相关的子查询开始执行时,不会重置临时表。
  • 该临时存储器可以作为该功能获取的系统资源的中心点。 如果函数获取系统资源,请指定FINAL CALL以确保 Db2 再次调用该函数,以便函数释放这些系统资源。

每次调用该函数时, Db2 都会向该函数传递一个包含临时存储器地址的额外参数。

如果您指定SCRATCHPAD, Db2

  • 在FETCH操作之间,不会将功能从一个任务控制块(TCB)移动到另一个任务控制块。
  • 在关闭光标之前,不允许其他函数或存储过程使用TCB。 这也适用于被声明为“保留”的游标。
无最终决定权最终决定权
指定是否对函数进行首次调用最终调用
NO FINAL CALL
首次呼叫和最终呼叫不适用于该功能。 默认值为“无最终通话”。
FINAL CALL
除了一个或多个 open 、fetchclose调用外,还向该函数发出第一次调用和最后一次调用
电话类型包括:
FIRST 调用
仅当该功能被定义为最终调用时,才会发生第一次调用。 在第一次呼叫之前,暂存器被设置为二进制零。 参数值传递给函数,函数可能会获取内存或执行其他一次性资源初始化。 但是,该函数不应向 Db2 返回任何数据,但可以为SQL状态和诊断消息参数设置返回值。
OPEN 调用
除非函数返回错误,否则会进行公开调用。 仅当函数定义为无最终调用时,临时存储器才会设置为二进制零。 参数值将传递给函数,函数可能会执行任何一次性的初始化操作。 但是,该函数不应向 Db2 返回任何数据。
FETCH 调用
除非函数在第一次调用或开放式调用时返回错误,否则会发生取回调用。 参数值将传递给函数, Db2 希望函数返回一行数据或表尾条件。 如果函数还传递了一个临时变量,则该临时变量不会受到先前调用的影响。
CLOSE 调用
除非函数在第一次调用、打开调用或获取调用期间返回错误,否则会发生接近调用。 没有SQL参数或SQL参数-ind值传递给函数,如果函数试图检查这些值,可能会出现不可预测的结果。 如果函数还传递了一个临时变量,则该临时变量不会受到先前调用的影响。

该函数不应向 Db2 返回任何数据,但可以为SQL状态和诊断消息参数设置返回值。 同样,在接近结束时,一个定义为“无最终调用”的函数应该释放它所获取的任何系统资源。 (用FINAL CALL定义的函数应在最后一次调用时释放所有已获取的资源。)

最终
最终调用与初始调用相抵消,并且与初始调用一样,仅在函数定义为最终调用时发生。 该函数可以为SQL状态和诊断信息参数设置返回值。 该函数还应释放其占用的所有系统资源。 在以下情况下,会发出最后一次呼叫:
  • 语句结束 :当光标指向语句时,光标消失,或者语句执行完毕。
  • 交易结束 :当语句处理未正常结束时。 例如,出于某种原因,应用程序的逻辑会绕过关闭光标。

如果提交、回滚或中止操作导致最终调用,则该函数在调用时不能发出任何SQL语句。

DISALLOW PARALLEL
指定 Db2 不考虑函数的并行性。
没有DBINFO DBINFO
指定在调用函数时是否将附加状态信息传递给函数。
NO DBINFO
没有传递任何额外信息。 缺省值为 NO DBINFO。
DBINFO
当函数被调用时,会传递另一个参数。 参数是一个包含应用程序运行时间授权ID、模式名称、函数可能插入或更新的表或列的名称以及调用函数的数据库服务器的标识等信息的数据结构。 有关参数及其结构的详细信息,请参阅 DBINFO结构
基数 整数
指定函数返回的预计行数。 该数字用于优化目的。 整数值必须在0到2147483647之间。

如果您没有指定 CARDINALITY,则 Db2 将采用有限值。 有限值是 Db2 为RUNSTATS实用程序未收集统计数据的表所设定的值。

如果一个函数具有无限基数——函数永远不会返回表尾条件 ,而总是返回一行,那么需要表尾正常工作的查询将需要中断。 因此,在涉及GROUP BY和ORDER BY的查询中,应避免使用此类功能。

NO COLLID COLLID 集合 ID
标识执行功能时使用的程序包集合。 这是与功能程序关联的DBRM绑定到其中的包集合。
NO COLLID
函数的包集合与调用函数的程序的包集合相同。 如果触发器调用该函数,则使用触发器包的集合。 如果调用程序不使用包,则 Db2 会依次使用CURRENT PACKAGE PATH特殊寄存器、CURRENT PACKAGESET特殊寄存器或PKLIST绑定选项来解析包。 有关如何的详细信息 Db2 使用这三项,请参阅覆盖 Db2 用于解析包列表的值中有关包解析的信息。

默认值为“不碰撞”。

COLLID collection-id
外部执行时使用的包集合的名称。
WLM 环境
标识运行该功能的WLM(工作负载管理器)应用环境。 WLM环境名称是一个SQL标识符。

如果您没有指定WLM环境,则该函数将在安装时指定的WLM建立的存储过程地址空间中运行。

名称
函数运行所处的WLM环境。 如果另一个用户定义的函数或存储过程调用该函数,且调用例程运行在未与WLM环境关联的地址空间中,则 Db2 会将函数请求路由到不同的地址空间。
(名字,*)
当SQL应用程序直接调用函数时,函数运行所处的WLM环境。

如果另一个用户定义的函数或存储过程调用该函数,则该函数将在调用例程使用的相同环境中运行。 在这种情况下,不会检查在WLM环境中运行该功能的授权,因为调用例程的授权已经足够。

用户必须获得适当的授权才能在指定的WLM环境中执行功能。

ASUTIME
指定函数单次调用可以运行的处理器总时间,以CPU服务单元为单位。 该值与资源限制规格表的 ASUTIME 列无关。

当您调试一个函数时,如果函数陷入循环,设置一个限制可能会有所帮助。 有关服务单元的信息,请参阅 z/OS MVS Initialization and Tuning Guide

无限制
服务单位没有限制。 默认值为“无限制”。
极限整数
CPU服务单元的数量限制为1-2147483647之间的正整数。 如果程序使用的服务单元数量超过指定值, Db2 将取消该程序。 在程序中,并行任务所消耗的CPU周期不计入指定的ASUTIME LIMIT。
STAY RESIDENT
指定当函数结束时,用于该函数的加载模块是否仍驻留在内存中。
功能结束后,负载模块将从内存中删除。 对于不可逆功能,请使用NO。 NO 是缺省值。
在函数结束后,负载模块仍保留在内存中。 使用 YES 表示可重入函数。
PROGRAM TYPE
指定函数程序是作为主程序还是子程序运行。
SUB
该功能作为子程序运行。 默认值为SUB。
MAIN
该功能作为主程序运行。
安全
指定函数如何与外部安全产品(如 RACF )交互,以控制对非SQL资源的访问。
Db2
该功能无需外部安全环境。 如果功能访问外部安全产品保护的资源,则使用与WLM建立的存储过程地址空间关联的授权ID进行访问。

Db2 是缺省值。

用户
应为该功能建立一个外部安全环境。 如果函数访问外部安全产品保护的资源,则使用调用函数的进程的主授权ID进行访问。
定义者
应为该功能建立一个外部安全环境。 如果功能访问外部安全产品保护的资源,则使用功能所有者的授权ID进行访问。
运行选项 runtime-options
指定用于函数的 Language Environment 运行时选项。 您必须将运行时选项指定为不超过254字节的字符串。 如果不指定 RUN OPTIONS 或传递空字符串, Db2 不会向 Language Environment 传递任何运行时选项, Language Environment 会使用其安装默认值。

有关 Language Environment 运行时选项的说明,请参阅 Language Environment Programming Reference

继承特殊注册默认特殊注册
指定在进入例程时如何设置特殊寄存器。
INHERIT SPECIAL REGISTERS
指定特殊寄存器的值根据用户定义函数或存储过程中的特殊寄存器特性表中列出的规则进行继承。
默认特殊注册
指定特殊寄存器初始化为默认值,如用户定义函数或存储过程的特殊寄存器中特殊寄存器特征表中的规则所示。
静态调度
在函数解析时, Db2 会根据函数参数的静态(或声明的)类型来选择函数。 默认值为静态调度。
系统默认故障后停止、 nn次故障后停止故障后继续
指定程序在出现一定次数的故障后是否进入停止状态。
系统默认故障后停止
指定在安装面板 DSNTIPX 上,当出现 MAX ABEND COUNT 字段值所指示的故障次数时,应将此例程置于停止状态。 这是缺省值。
在nn次失败后停止
规定在发生nn次故障后,该程序应置于停止状态。 值nn 可以是1-32767之间的整数。
失败后继续
规定在任何故障发生后,该程序不应处于停止状态。
NOT SECURED 或者 SECURED
指定该功能在行访问控制和列访问控制中是否安全。
NOT SECURED
指定该功能在行访问控制和列访问控制中不被视为安全。

NOT SECURED 是默认值。

当调用函数时,如果表使用活动列访问控制,则函数的参数不得引用启用列掩码的列。

SECURED
指定该功能在行访问控制和列访问控制中是安全的。

当在行权限或列掩码中引用该函数时,必须使用SECURED进行定义。

CREATE FUNCTION(外部表)的注释

所有类型的用户自定义功能注意事项:
有关适用于所有类型用户定义函数的注意事项,请参阅 CREATE FUNCTION语句(概述 )。
字符串表示注意事项:
PARAMETER VARCHAR子句是LANGUAGE C函数特有的,因为C语言中原生使用以NUL结尾的字符串。 当字符串数据已知包含嵌入的NUL终止符时,VARCHAR结构表示很有用。 当不能保证字符串数据不包含嵌入的NUL终止符时,它也很有用。

参数 VARCHAR 不适用于固定长度的字符串、VARCHAR FOR BIT DATA、CLOB、DBCLOB 或隐式生成的参数。 该条款不适用于 VARCHAR FOR BIT DATA,因为 BIT DATA 可以包含 X'00' 字符 ,其值表示以长度信息开头。 它不适用于LOB数据,因为LOB值的表示以长度信息开头。

参数VARCHAR不适用于隐式提供给外部函数的可选参数。 例如,LANGUAGE C的CREATE FUNCTION语句还必须指定PARAMETER STYLE SQL,该语句返回一个以NULL结尾的SQLSTATE字符串;该SQLSTATE不会以VARCHAR结构形式表示。 同样,代表函数限定名称、函数特定名称或返回给数据库管理器的 SQL 诊断字符串的参数都不会以 VARCHAR 结构形式表示。

在WLM环境中运行外部功能:
您可以使用 WLM ENVIRONMENT 子句来确定函数或要运行的地址空间。 通过使用不同的 WLM 环境,您可以将一组程序与另一组程序隔离开。 例如,您可以根据安全要求隔离程序,并将所有工资单应用程序放置在一个WLM环境中,因为这些应用程序处理的是员工工资等数据。

为了防止用户在敏感的WLM环境中定义函数, Db2 会调用外部安全管理器来确定用户是否有权限发出引用指定WLM环境的CREATE FUNCTION语句。 以下示例显示了 RACF 命令,该命令授权 Db2 用户 DB2USER1 在 Db2 子系统 DB2A 上注册一个功能,该功能在名为PAYROLL的WLM环境中运行。

   PERMIT DB2A.WLMENV.PAYROLL CLASS(DSNR) ID(DB2USER1)  ACCESS(READ)

更多信息,请参阅 《WLM环境中创建存储过程的授权管理 》。

判断一个表函数是否为通用表函数:
要确定表函数是否为通用表函数,您可以查询 SYSIBM.SYSROUTINES 目录表。 当ROUTINETYPE列的值为“F”且FUNCTIONTYPE列的值为“T”时,如果RESULT_COLS列的值为0(零),则该函数为通用表函数。
其他语法和同义词:
为了与 Db2Db2 系列中其他产品的早期版本兼容, Db2 支持以下替代语法:
  • VARIANT作为“非确定性”的同义词
  • NOT VARIANT 并非“确定性”的同义词
  • NOT NULL CALL作为RETURNS NULL ON NULL INPUT的同义词
  • NULL CALL作为CALLED ON NULL INPUT的同义词
  • 参数风格 DB2SQL 作为参数风格的同义词 SQL
  • TIMEZONE可以作为TIME ZONE的替代选项。

CREATE FUNCTION(外部表)示例

以下示例注册了一个表函数,用于返回一行,其中包含文本管理系统中每个已知文档的单个文档标识符列。 第一个参数与给定的主题领域匹配,第二个参数包含给定的字符串。

在单个会话中,表函数总是返回同一个表;因此,它被定义为确定性(DETERMINISTIC)。 此外,还添加了“不允许并行”关键字,因为表函数不能并行运行。

尽管DOCMATCH的输出大小变化很大,但基数20是一个有代表性的值,用于帮助 Db2
    CREATE FUNCTION DOCMATCH (VARCHAR(30), VARCHAR(255))
                       RETURNS TABLE (DOC_ID CHAR(16))
      EXTERNAL NAME ABC
      LANGUAGE C
      PARAMETER STYLE SQL
      NO SQL
      DETERMINISTIC
      NO EXTERNAL ACTION
      FENCED
      SCRATCHPAD
      FINAL CALL
      DISALLOW PARALLEL
      CARDINALITY 20;
示例2: 以下示例注册了一个通用表函数:
CREATE FUNCTION tf6(p1 VARCHAR(10))
	RETURNS GENERIC TABLE
	EXTERNAL NAME 'tf6'
	LANGUAGE C
	PARAMETER STYLE SQL
	DETERMINISTIC
	NO EXTERNAL ACTION
	FENCED
	SCRATCHPAD
	FINAL CALL;
请注意,在SELECT子句中引用表函数时,必须指定LANGUAGE C,并声明结果列的名称和数据类型。