ALTER FUNCTION 语句(外部函数)

ALTER FUNCTION 语句用于更改当前服务器上用户定义的外部标量函数或外部表函数的描述。

调用ALTER FUNCTION(外部)

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

ALTER FUNCTION(外部)授权

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

  • 拥有该功能
  • 架构上的ALTERIN权限
  • SYSADM 或 SYSCTRL 权限
  • 系统 DBADM
  • 更改开始安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)更改结束

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

更改开始如果用于更改函数的授权ID具有安装SYSADM权限或安装SYSOPR权限,并且当前SQLID设置为SYSINSTL,则在重新评估函数定义时,该函数将被识别为系统定义的函数。更改结束

如果指定了“安全”选项,或者当前功能已锁定,但指定了“未锁定”选项,则至少需要以下一项特权:
  • SECADM 权限
  • CREATE_SECURE_OBJECT权限

对于外部标量函数 ,当 LANGUAGEJAVA并且EXTERNAL NAME 子句中指定了JAR文件名,则权限集必须包含JAR文件的USAGE权限。

权限设置:

如果语句嵌入到应用程序中,权限集就是软件包所有者所拥有的权限。

如果语句是动态准备的,则权限集是指由进程的SQL授权ID所持有的权限集。 指定的例程名称可以包含模式名称(限定符)。 但是,如果架构名称与这些 SQL 授权 ID 中的任何一个都不相同,则必须满足以下条件之一:
  1. 特权集包括系统管理员权限
  2. 特权集包括SYSCTRL权限
  3. 该进程的SQL授权ID具有对模式进行ALTERIN操作的权限

如果运行功能的环境发生变化,授权 ID 必须有权使用指定的 WLM 环境。 所需的授权来自外部安全产品,例如 RACF®。更多信息,请参阅在WLM环境中管理创建存储过程的授权

ALTER FUNCTION(外部)的语法

阅读语法图跳过可视化语法图ALTERfunction-designatoroption-list
功能代号:
阅读语法图跳过可视化语法图FUNCTION功能名称(,参数类型)SPECIFIC FUNCTION专有名词
参数类型:
阅读语法图跳过可视化语法图数据类型AS LOCATOR1
数据类型:
阅读语法图跳过可视化语法图built-in-type2独特类型名称数组类型名称3
option-list
阅读语法图跳过可视化语法图4EXTERNAL NAME 外部程序名称5标识 LANGUAGE ASSEMBLECCOBOLJAVA67PLI PARAMETER STYLE SQLJAVA67 NOT DETERMINISTICDETERMINISTICRETURNS NULL ON NULL INPUTCALLED ON NULL INPUTMODIFIES SQL DATA7READS SQL DATACONTAINS SQLNO SQLNO EXTERNAL ACTIONEXTERNAL ACTIONPACKAGE PATH包路径NO PACKAGE PATHNO SCRATCHPADSCRATCHPAD长度NO FINAL CALLFINAL CALLALLOW PARALLEL7DISALLOW PARALLELNO DBINFODBINFOCARDINALITY整数8NO COLLIDCOLLID收藏-IDWLM ENVIRONMENT 名称(名称,*) ASUTIME NO LIMITLIMIT整数 STAY RESIDENT NOYES PROGRAM TYPE SUBMAIN SECURITY DB2USERDEFINER STOP AFTER SYSTEM DEFAULT FAILURESSTOP AFTER整数FAILURESCONTINUE AFTER FAILURERUN OPTIONS运行时选项INHERIT SPECIAL REGISTERSDEFAULT SPECIAL REGISTERSSTATIC DISPATCHSECUREDNOT SECURED
外部Java程序名
阅读语法图跳过可视化语法图罐子名:方法名method-signature
罐子名
阅读语法图跳过可视化语法图模式名称.jar-id
method-name
阅读语法图跳过可视化语法图 包裹编号./9.!10方法-ID
method-signature
阅读语法图跳过可视化语法图(, java数据类型)
注意:
  • 1 AS LOCATOR 只能为 LOB 数据类型或基于 LOB 数据类型的独特类型指定。
  • 2 有关该片段的语法图,请参阅内置类型的语法。
  • 3 array-type-name 仅支持编译后的 SQL 标量函数。
  • 4 按任意顺序指定选项。 请至少选择一项。 请勿多次指定同一选项。
  • 5 如果 LANGUAGEJAVA, EXTERNAL NAME 必须指定一个有效的 external-java-routine 名称
  • 6LANGUAGE JAVA 时、 PARAMETER STYLE JAVA 也必须指定。 当指定了 PARAMETER STYLE JAVA 指定了日期, LANGUAGE JAVA 也必须指定。
  • 7 LANGUAGE JAVA, PARAMETER STYLE JAVA, MODIFIES SQL DATAALLOW PARALLEL 不支持外部表格功能
  • 8 CARDINALITY 不支持外部标量函数
  • 9 支持斜线 (/),以便与 Db2 for z/OS® 以前的版本兼容。
  • 10 支持感叹号 (!) 是为了与 Db2 系列的其他产品兼容。

ALTER FUNCTION(外部)描述

function-designator

标识要更改的功能,必须是外部功能。 函数设计器通过名称、唯一标识函数的函数签名或具体名称来标识 SQL 函数。 更多信息,请参阅功能代号

数据类型的数量和数据类型的逻辑连接用于唯一地标识功能。 因此,您不能更改参数的数量或参数的数据类型。

以下条款更改了已确定更改的功能描述。

EXTERNAL NAME 外部程序名称标识符
标识调用功能时运行的用户编写代码(程序)。

如果 LANGUAGEJAVA,则必须指定外部程序名称 ,并将其放在单引号中,且单引号内不能有空格。 它必须指定一个有效的 external-java-routine-name。 如果指定了多个外部程序名称 ,则所有名称的总长度不得超过 1305 字节,且必须用空格或换行符隔开。 不要为正在生效的Java™函数指定JAR文件, NO SQL 正在生效。

外部Java程序名称包含以下部分:
罐子名
标识JAR文件在数据库中安装时所取的名称。 名称包含 jar-id ,可选地使用模式限定。 例如: "myJar" 和 "mySchema.myJar。” 根据以下规则,无限制的jar-id 隐式地使用模式名称进行限定:
  • 如果语句嵌入在程序中,则方案名称是创建或最后修改软件包或计划时,软件包或计划 BIND 子命令QUALIFIER选项中的授权ID。 当创建或最后修改本机SQL存储过程时,方案名称也可以是CREATE PROCEDURE或ALTER PROCEDURE语句中QUALIFIER选项中的授权ID。 如果未指定限定符,则模式名称为包、计划或本机 SQL 过程的所有者。
  • 如果语句是动态准备的,则模式名称是当前模式特殊寄存器中的SQL授权ID。

如果指定了 jar-name ,则在处理ALTER FUNCTION语句时,该jar-name必须存在。

如果未指定 jar-name ,则直接从类文件加载函数。 Db2 搜索与WLM环境关联的CLASSPATH目录。 Java例程的环境变量在JCL上的JAVAENV DD卡中指定,用于启动WLM管理功能的地址空间。

方法名
标识方法名称,不得超过254字节。 它的包、类和方法ID是Java特有的,因此不限于18个字节。 此外,方法标识符可以包含的内容与SQL普通标识符的规则并不一定相同。
包裹ID
识别一个包。 一系列包标识符确定了类标识符所属的包。 如果类属于某个包的一部分,则方法名称必须包含完整的包前缀,例如 "myPacks.UserFuncs Java虚拟机在 "/myPacks/UserFuncs/" 目录中查找类。
班级编号
标识Java对象的类标识符。
方法-ID
确定方法标识符与要调用的Java类。
方法签名
为参数列表确定一个零个或多个Java数据类型的列表,且不得超过1024字节。 如果用户定义的函数涉及任何可以为空值的输入或输出参数,请指定方法签名。 当正在创建的函数被调用时, Db2 搜索具有精确方法签名的 Java 方法。 指定的 Java数据类型元素的数量表示Java方法必须具有的参数数量。

Java程序不能有参数。 在这种情况下,您需要为方法签名编写一组空括号。 如果没有指定Java 方法签名Db2 将搜索一个Java方法,其签名来自与ALTER FUNCTION语句参数列表中指定的SQL类型关联的默认 JDBC 类型。

对于其他值 LANGUAGE,该值必须符合加载模块的命名约定:该值必须小于或等于8个字节,并且必须符合普通标识符的规则,但不得包含下划线。

LANGUAGE
指定编写函数的编程语言。 所有程序必须能在 IBM® 的 Language Environment® 环境中运行。
ASSEMBLE
该功能是用汇编语言编写的。
C
该功能是用C或C++编写的。
COBOL
该函数使用 COBOL 编写,包括面向对象语言扩展。
JAVA
用户自定义函数以Java语言编写,并在Java虚拟机中执行。 如果ALTER FUNCTION语句导致将 LANGUAGEJAVA 和一个 PARAMETER STYLE JAVA 并且必须指定一个 EXTERNAL NAME 子句来提供适当的值。 什么时候 LANGUAGE JAVA 被指定, EXTERNAL NAME 子句还必须指定有效的 external-java-routine-namePARAMETER STYLE 必须指定 JAVA

不要指定 LANGUAGE JAVA 什么时候 SCRATCHPADFINAL CALLDBINFOPROGRAM TYPE MAIN,或 RUN OPTIONS 时。 不要 LANGUAGE JAVA 表格功能。

PLI
该函数以 PL/I 编写。
参数 风格
指定函数程序用于从调用SQL语句接收输入参数并将返回值传递给调用SQL语句的链接约定。
SQL
指定支持将空值作为输入和输出传递的参数传递约定。 在调用SQL语句和函数之间传递的参数包括:
  • 输入参数。 前n个参数是函数指定的输入参数。
  • 结果参数。 对于外部标量函数,函数结果的参数。 对于外部表函数,在定义函数的CREATE语句的RETURNS TABLE子句中指定的下一个m个参数
  • 输入参数指示变量。 输入参数的指标变量的 n个参数
  • 结果参数指示变量。 对于外部标量函数,在定义函数的CREATE语句的RETURNS子句中指定函数结果的指示变量参数。 对于外部表函数,在定义函数的CREATE语句的RETURNS TABLE子句中指定函数结果列的指标变量的 m个参数
  • SQLSTATE将返回至 Db2
  • 函数的限定名称。
  • 特定功能的名称。
  • SQL诊断字符串将返回至 Db2
  • 如果 SCRATCHPAD 指定了。
  • 呼叫类型。 对于外部标量函数,仅当 FINAL CALL 被指定时。 调用类型始终传递给外部表函数。
  • 如果指定了DBINFO结构,则 DBINFO 被指定。
JAVA
表示用户定义的函数使用符合Java和SQLJ规范的参数传递约定。 如果ALTER FUNCTION语句导致将 LANGUAGEJAVA 和一个 PARAMETER STYLE JAVA 并且必须指定一个 EXTERNAL NAME 子句来提供适当的值。 PARAMETER STYLE JAVA 仅当 LANGUAGEJAVAJAVA 必须指定 PARAMETER STYLELANGUAGEJAVA

不要 PARAMETER STYLE JAVA 表格功能。

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

某些调用非确定性函数的SQL函数可能会在并行任务执行该函数时收到错误结果。 请为这些功能指定 DISALLOW PARALLEL 这些功能的条款。

如果视图或已实现的查询表定义引用了该函数,则不能将该函数更改为 NOT DETERMINISTIC。 要更改函数,请先删除引用该函数的任何视图或具体化查询表。

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

Db2 不保证功能程序符合规格要求 DETERMINISTICNOT DETERMINISTIC

RETURNS NULL ON NULL INPUT 或者 CALLED ON NULL INPUT
指定当任何输入自变量在执行期间为空时是否调用函数。
RETURNS NULL ON NULL INPUT
如果任何输入参数为空,则不会调用该函数。 对于外部标量函数,结果为空值。 对于外部表函数,结果是一个空表,即没有行的表。
CALLED ON NULL INPUT
无论输入参数是否为空,都会调用该函数,因此该函数负责检测参数是否为空。 对于外部标量函数,函数可以返回空值或非空值。 对于外部表函数,根据其逻辑,该函数可以返回一个空表。
MODIFIES SQL DATAREADS SQL DATACONTAINS SQLNO SQL
指定此例程可以执行或调用的SQL语句和嵌套例程的分类。 数据库管理员负责验证函数发出的SQL语句以及本地调用的所有例程是否符合规范;当调用嵌套的远程例程时,不会进行验证。 有关每条语句的分类,请参阅例程的SQL语句数据访问分类
MODIFIES SQL DATA
指定函数可以执行任何SQL语句,但不支持函数不支持的语句。 不要指定 MODIFIES SQL DATA 生效时 ALLOW PARALLEL 生效。

更改开始如果使用 MODIFIES SQL DATA 定义的函数被调用到除最外层 SELECT 语句的 select-clause 之外的任何地方,结果都是不可预测的,因为根据所使用的访问计划,函数可能会被多次调用。更改结束

建议 更改开始如果 SELECT 语句调用了使用 MODIFIES SQL DATA 选项定义的函数,请确保嵌套在该函数内部的语句不会修改任何嵌套级别更高的 SQL 语句中引用的对象。 否则,很可能出现不可预测的结果。更改结束
READS SQL DATA
指定函数可以执行带有数据访问指示的语句,包括READS SQL DATA、CONTAINS SQL或NO SQL。 该功能无法执行修改数据的SQL语句。
CONTAINS SQL
指定该函数只能执行数据分类为CONTAINS SQL或NO SQL的SQL语句。 该函数可以执行既不读取也不修改 SQL 数据的 SQL 语句。 任何函数不支持的语句都会返回不同的错误。
NO SQL
指定函数只能执行数据访问分类为“非 SQL”的 SQL 语句。 不要 NO SQL 用于使用JAR文件的Java函数。
NO EXTERNAL ACTION 或者 EXTERNAL ACTION
指定函数是否执行操作,以改变 Db2 不管理的对象的状态。 外部操作的一个示例是发送消息或将记录写入文件。

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

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

如果并行任务执行函数,某些调用具有外部操作的函数的SQL语句可能会导致错误结果。 例如,如果函数为每个初始调用发送一个注释,则为每个并行任务发送一个注释,而不是为函数发送一个注释。 请指定 DISALLOW PARALLEL 无法在并行模式下正常运行的函数。

如果您指定 EXTERNAL ACTIONDb2

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

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

如果视图或已实现的查询表定义引用了该函数,则不能将该函数更改为 EXTERNAL ACTION。 要更改函数,请先删除引用该函数的任何视图或具体化查询表。

Db2 不保证功能程序符合规格要求 EXTERNAL ACTIONNO EXTERNAL ACTION

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

如果 COLLID 条款中指定了 PACKAGE PATH,则 COLLID 在调用函数时忽略该子句。

当函数被调用时,会检查与函数定义相关的包路径值。 如果包路径包含 SESSION_USER(或 USER)、PATH 或 PACKAGE PATH,则在检查包路径值时返回错误。

NO SCRATCHPAD 或者 SCRATCHPAD
指定 Db2 是否为该功能提供临时存储器。 强烈建议使用可重入的外部函数和临时存储器(为函数提供区域,用于保存从一次调用到下一次调用的信息)。
NO SCRATCHPAD
暂存器未分配给函数。
SCRATCHPAD 长度
当第一次调用该功能时, Db2 会为临时存储器分配内存。 记事本具有以下特点:
  • 长度必须在1-32767之间。 默认值为100字节。
  • Db2 将暂存器初始化为全二进制零 (X'00' )。
  • 临时存储器的范围是SQL语句。 在SQL语句中,每个函数对应一个临时表。
    例如,假设用户自定义函数UDFX是一个标量函数,使用 SCRATCHPAD 选项定义的标量函数,则会在以下SQL语句中为UDFX的三个引用分配三个临时区:
       SELECT A, UDFX(A) FROM TABLEB
         WHERE UDFX(A) > 103 OR UDFX(A) < 19;
    再举一个例子,假设UDFX是一个用户定义的表函数,使用 SCRATCHPAD 选项定义的。 在以下SQL语句中,有两个参考项分配了两个临时表,用于函数UDFX:
       SELECT *
         FROM TABLE (UDFX(A)), TABLE (UDFX(B)); 

    如果函数在并行任务下运行,则将为SQL语句中函数引用的每个并行任务分配一个临时存储器。 否则将导致不可预测的结果。 例如,如果某个函数使用临时存储器来计算调用次数,则计算结果反映的是并行任务而非SQL语句的调用次数。 请指定 DISALLOW PARALLEL 无法在并行模式下正常运行的函数。

  • 临时记事本会一直保留。 Db2 在函数调用之间保持其内容不变。 功能对一次通话中的记事本所做的任何更改,在下次通话中仍然存在。 Db2 在开始执行SQL语句时初始化临时存储区。 Db2 当相关的子查询开始执行时,不会重置临时表。
  • 该临时存储器可以作为该功能获取的系统资源的中心点。 如果函数获取系统资源,请指定 FINAL CALL ,以确保 Db2 再次调用该函数,以便该函数释放这些系统资源。

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

如果您指定 SCRATCHPADDb2

  • FETCH操作之间不会将功能从一个TCB或地址空间移动到另一个TCB或地址空间。
  • 在关闭光标之前,不允许其他函数或存储过程使用TCB。 这也适用于声明为“保留”的游标。

不要指定 SCRATCHPADLANGUAGE JAVA 时。

NO FINAL CALL 或者 FINAL CALL
指定是否对函数进行最终调用。 最后一次调用可释放已占用的系统资源。 当函数使用 SCRATCHPAD 关键字定义,且函数获取系统资源并将其固定在临时存储器中时,最后调用很有用。

NO FINAL CALLFINAL CALL 取决于外部函数是标量函数还是表函数。

对于外部标量函数:
NO FINAL CALL
不会对外部标量函数进行最终调用。 该函数没有接收指定调用类型的额外参数。
FINAL CALL
最后调用外部标量函数。 请参阅以下呼叫类型描述,了解最终呼叫的特征。 当 FINAL CALL 被指定时,函数会收到一个附加参数,该参数指定调用类型,使函数能够区分最终调用和其他类型的调用。 不要指定 FINAL CALLLANGUAGE JAVA 时。
欲了解更多信息,请访问 NO FINAL CALL 以及 FINAL CALL 外部标量函数(包括调用类型)的更多信息,请参阅 CREATE FUNCTION语句(外部标量函数 )选项的描述。
对于外部表函数:
NO FINAL CALL
外部表函数不会发出第一次和最后一次调用。
FINAL CALL
除了一个或多个其他类型的调用外,还向外部表函数进行了第一次调用和最后一次调用。
对于 NO FINAL CALLFINAL CALL,函数会收到一个附加参数,用于指定调用类型。 有关外部表函数NO FINAL CALL和FINAL CALL的更多信息,包括调用类型,请参阅 CREATE FUNCTION语句(外部表函数) 选项的描述。
ALLOW 或者 DISALLOW PARALLEL
指定对于函数的单个引用,是否可以并行执行该函数。 如果函数定义为 MODIFIES SQL DATA,请指定 DISALLOW PARALLEL,而不是 ALLOW PARALLEL
ALLOW PARALLEL
指定 Db2 可以考虑函数的并行性。 调用函数的SQL语句或函数中的任何SQL语句都不会强制使用并行性。 现行平行进口限制条件适用。

请参阅 SCRATCHPADEXTERNAL ACTION在指定时需要考虑的因素 FINAL CALL 在指定时需要考虑的 ALLOW PARALLEL时需要考虑的事项。

DISALLOW PARALLEL
指定 Db2 不考虑函数的并行性。
NO DBINFO 或者 DBINFO
指定在调用函数时是否将附加状态信息传递给函数。
NO DBINFO
其他信息不会传递。
DBINFO
当函数被调用时,会传递另一个参数。 参数是一个包含应用程序运行时间授权ID、模式名称、函数可能插入或更新的表或列的名称以及调用函数的数据库服务器的标识等信息的数据结构。 有关参数及其结构的详细信息,请参阅 DBINFO结构

不要指定 DBINFOLANGUAGE JAVA 时。

CARDINALITY 整数
指定函数返回的预计行数。 该数字用于优化目的。 整数值必须在0到2147483647之间。

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

不要 CARDINALITY 外部标量函数。

NO COLLIDCOLLID 收藏编号
标识执行功能时使用的程序包集合。 这是与功能相关的DBRM绑定到其中的包集合。
NO COLLID
指定函数的包集合与调用函数的程序的包集合相同。 如果触发器调用该函数,则使用触发器包的集合。 如果调用程序不使用包,则 Db2 会依次使用CURRENT PACKAGE PATH特殊寄存器、CURRENT PACKAGESET特殊寄存器或PKLIST绑定选项来解析包。 有关 Db2 如何使用这三项的详细信息,请参阅绑定应用计划中的打包分辨率信息。
COLLID 收藏-ID
指定执行函数时使用的包集合的名称。
WLM ENVIRONMENT
一个SQL标识符,用于标识运行该函数的WLM(工作负载管理器)应用程序环境的名称
名字
函数运行所处的WLM环境。 如果用户定义的函数是嵌套的,并且调用存储过程或调用用户定义的函数未在与指定的 WLM 环境关联的地址空间中运行,则 Db2 会将函数请求路由到不同的地址空间。
(名字 ,*)
当SQL应用程序调用该函数时 ,name 指定函数运行的WLM环境。

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

WLM环境名称是一个SQL标识符。

您必须拥有WLM环境的相应权限。

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

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

NO LIMIT
服务单位没有限制。
LIMIT 整数
CPU服务单元的数量限制为1-2147483647之间的正整数。 如果程序使用的服务单元数量超过指定值, Db2 将取消该程序。 在程序中,并行任务所消耗的CPU周期不计入指定的ASUTIME LIMIT。
STAY RESIDENT
指定当函数结束时,用于该函数的加载模块是否仍驻留在内存中。
NO
功能结束后,负载模块将从内存中删除。 用于不可逆函数。 NO 用于不可逆函数。
YES
在函数结束后,负载模块仍保留在内存中。 用于重入函数。 YES 用于重入函数。
PROGRAM TYPE
指定函数程序是作为主程序还是子程序运行。
SUB
该功能作为子程序运行。
MAIN
该功能作为主程序运行。

不要指定 PROGRAM TYPE MAIN 生效时 LANGUAGE JAVA 生效。

SECURITY
指定函数如何与外部安全产品(如 RACF )交互,以控制对非SQL资源的访问。
DB2
该功能无需外部安全环境。 如果功能访问外部安全产品保护的资源,则使用与WLM建立的存储过程地址空间关联的授权ID进行访问。
USER
该功能应配合外部安全环境使用。 如果函数访问外部安全产品保护的资源,则使用调用函数的进程的主授权ID进行访问。
DEFINER
该功能应配合外部安全环境使用。 如果功能访问外部安全产品保护的资源,则使用功能所有者的授权ID进行访问。
STOP AFTER SYSTEM DEFAULT FAILURESSTOP AFTER nn FAILURESCONTINUE AFTER FAILURE
指定程序在出现一定次数的故障后是否进入停止状态。 SQL函数或源函数不得指定以下选项。
STOP AFTER SYSTEM DEFAULT FAILURES
指定在安装面板 DSNTIPX 上,当出现 MAX ABEND COUNT 字段值所指示的故障次数时,应将此例程置于停止状态。
STOP AFTER nn FAILURES
规定在发生nn次故障后,该程序应置于停止状态。 值nn 可以是1-32767之间的整数。
CONTINUE AFTER FAILURE
规定在任何故障发生后,该程序不应处于停止状态。
RUN OPTIONS 运行时选项
指定用于函数的 Language Environment 运行时选项。 您必须将运行时选项指定为不超过 254 字节的字符串。 若要使用无选项替换任何现有运行时间选项,请使用空字符串并 RUN OPTIONS。 如果指定的是空字符串, Db2 不会向 Language Environment 传递任何运行时选项,而 Language Environment 会使用其安装默认值。

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

不要指定 RUN OPTIONSLANGUAGE JAVA 时。

INHERIT SPECIAL REGISTERS 或者 DEFAULT SPECIAL REGISTERS
指定在进入例程时如何设置特殊寄存器。
INHERIT SPECIAL REGISTERS
指定特殊寄存器应根据用户定义函数或存储过程中的特殊寄存器特性表中列出的规则进行继承。
DEFAULT SPECIAL REGISTERS
指定特殊寄存器应初始化为默认值,如用户定义函数或存储过程的特殊寄存器中特殊寄存器特征表中的规则所示。
STATIC DISPATCH
在函数解析时, Db2 会根据函数参数的静态(或声明的)类型来选择函数。
SECURED 或者 NOT SECURED
指定该功能是否安全。
SECURED
指定该功能被视为安全。

更改开始使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改更改结束

NOT SECURED
指定该功能不安全。 当行权限或列掩码取决于函数时,不能指定NOT SECURED。

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

更改开始使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改更改结束

ALTER FUNCTION(外部)的备注

包裹失效:
根据指定的条款和关键字以及其他因素,此语句可能会使所有依赖于目标对象的程序包失效,有时还会通过级联效应影响其他相关对象。 更多信息,请参阅 “导致套餐失效的变更 ”。
LANGUAGE C和PARAMETER VARCHAR子句:
ALTER语句不允许您更改 PARAMETER VARCHARPARAMETER CCSID 与函数定义相关的子句的值。 不过,您可以修改 LANGUAGE 功能条款。 如果 PARAMETER VARCHAR 子句指定用于创建 LANGUAGE C 函数,则该选项的目录信息不受后续 ALTER 函数语句的影响。 该功能可能会更改为C语言以外的其他语言,在这种情况下, PARAMETER VARCHAR 设置将被忽略。 如果稍后更改回LANGUAGE C,则将使用 PARAMETER VARCHAR 选项的设置将被使用。
将一个功能从“未加密”改为“已加密”:
通常,安全管理员会检查函数访问的数据,确保其安全,并向需要权限的用户授予CREATE_SECURE_OBJECT权限,以便更改用户定义的函数,使其受到保护。 当函数被更改为SECURED后,安全管理员将撤销函数所有者对CREATE_SECURE_OBJECT的权限。

在执行ALTER FUNCTION语句后,该函数被视为安全。 Db2 将SECURED属性视为一个断言,声明安全管理员已为用户定义函数的任何更改建立了审计程序。 Db2 假定对所有后续的ALTER FUNCTION语句或外部包的更改都执行了这样的控制审计程序。

动态报表缓存中引用该函数的包和报表无效。

将“安全”功能改为“非安全”功能:
当函数从“安全”更改为“不安全”时,动态语句缓存中引用该函数的包和语句将失效。 如果未受保护的函数访问使用行访问控制或列访问控制的表中的数据,则可能会对性能产生负面影响。 为了将性能影响降到最低,要么更改函数以使用SECURED选项,要么停用函数正在访问的表的行访问控制或列访问控制。
在安全函数中调用其他用户定义的函数:
当在引用使用行访问控制或列访问控制的表的SQL数据更改语句中引用安全的用户定义函数时,如果安全的用户定义函数调用其他用户定义函数,则嵌套的用户定义函数将不被验证为安全。 如果这些嵌套函数可以访问敏感数据,安全管理员需要确保这些函数被允许访问敏感数据,并确保已针对这些函数的任何更改建立了变更控制审核程序。
DSN_FUNCTION_TABLE EXPLAIN表中的SECURE列:
DSN_FUNCTION_TABLE EXPLAIN表中的SECURE列指示用户定义的函数是否安全。
其他语法和同义词:
为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 支持以下关键词:
  • VARIANT作为同义词 NOT DETERMINISTIC
  • NOT VARIANT作为同义词 DETERMINISTIC
  • NOT NULL CALL作为同义词 RETURNS NULL ON NULL INPUT
  • NULL CALL作为同义词 CALLED ON NULL INPUT
  • 参数 风格 DB2SQL 作为 PARAMETER STYLE SQL
  • TIMEZONE可以作为TIME ZONE的替代选项。

ALTER FUNCTION(外部)示例

示例 1
假设在PELLOW模式中有两个CENTER函数。 第一个函数有两个输入参数,分别为整数型和浮点型数据类型。 第一个函数的特定名称为 FOCUS1。 第二个函数有三个参数,分别是字符型(CHAR(25))、十进制型(DEC(5,2))和整数型(INTEGER)。
使用特定名称来标识功能,将第一个功能运行的WLM环境从 WLMENVNAME1 更改为 WLMENVNAME2:
   ALTER SPECIFIC FUNCTION ENGLES.FOCUS1 WLM ENVIRONMENT WLMENVNAME2;
示例 2
更改示例1中描述的第二项功能,使其在任何参数为空时不会调用。 使用功能签名来识别功能:
   ALTER FUNCTION ENGLES.CENTER (CHAR(25), DEC(5,2), INTEGER)
      RETURNS NULL ON NULL INPUT;

您也可以在不对CHAR和DEC数据类型使用精确值的情况下编写ALTER FUNCTION语句:

   ALTER FUNCTION ENGLES.CENTER (CHAR(), DEC(), INTEGER)
      RETURNS NULL ON NULL INPUT;

如果您使用空括号, Db2 在寻找匹配的数据类型时,会忽略长度、精度和比例属性。