CREATE FUNCTION 语句(已编译的 SQL 标量函数)
CREATE FUNCTION(已编译的SQL标量)语句用于在当前服务器上定义已编译的SQL标量函数,并指定函数的源语句。 函数的主体是用SQL过程语言编写的。 每次调用该函数时,它都会返回一个值。
为编译的SQL标量函数创建一个包。
对于已编译的SQL标量函数,您可以定义函数的多个版本。 使用CREATE FUNCTION(已编译的SQL标量)定义初始版本,使用ALTER FUNCTION定义后续版本。 有关SQL函数支持的SQL语句的信息,请参阅 SQL程序语句(SQL PL )。
CREATE FUNCTION调用(已编译的SQL标量)
对于编译的SQL函数,只能动态准备此语句,但必须以隐式或显式方式指定DYNAMICRULES运行行为。
CREATE FUNCTION(已编译的SQL标量)授权
以下定义的特权必须至少包含以下一项:
- 根据安装面板上“绑定新软件包”字段的值,创建模式上的CREATEIN权限以及添加新软件包或现有软件包新版本的所需授权 DSNTIPP
- SYSADM 或 SYSCTRL 权限
- 系统 DBADM
安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
与模式名称匹配的授权ID隐式拥有该模式的CREATEIN权限。
如果用于创建函数的授权ID具有安装SYSADM权限或安装SYSOPR权限,并且当前SQLID设置为SYSINSTL,则该函数被标识为系统定义的函数。
如果引用了用户定义的类型(作为参数或SQL变量的数据类型),则权限集还必须至少包含以下内容之一:
- 用户自定义类型的所有权
- 用户自定义类型的使用权限
- 系统 DBADM 权限
- DATAACCESS 权限
- SYSADM 权限
如果函数使用表作为参数,则权限集还必须至少包含以下内容之一:
- 对表的所有权
- 表中的 SELECT 权限
- DATAACCESS 权限
- SYSADM 权限
根据函数定义的内容,SYSDUMMYx表可能需要额外的授权。 参见 SYSDUMMYx表。
权限集: 如果该语句嵌入在应用程序中,则权限集就是计划或包的所有者所拥有的权限。 如果包的所有者是一个角色,则隐式模式匹配不适用,该角色需要包含前面列出的条件之一。
如果语句动态生成,且未在指定了 ROLE AS OBJECT OWNER 子句的可信环境中运行,则权限集是指进程的 SQL 授权 ID 所拥有的权限集。 如果架构名称与进程的SQL授权ID不同,则必须满足以下条件之一:
- 特权集包括SYSADM或SYSCTRL权限。
- 该进程的SQL授权ID对模式具有CREATEIN权限。

- 如果没有指定“包裹所有者”选项,则与活页夹关联的角色将成为包裹所有者。
- 如果指定了“包所有者”选项,则“包所有者”选项中指定的角色将成为包所有者。 在可信的环境中,指定的“包裹所有者”必须是一个角色。

如果您指定了 WLM ENVIRONMENT FOR DEBUG MODE 子句,则将调用 RACF® 或外部安全产品来检查在 WLM 环境中定义程序所需的权限。 如果WLM环境访问在 RACF 中受到保护,则权限集必须包含所需的权限。
如果指定了SECURED选项,则至少需要以下一项附加特权
- SECADM 权限
- CREATE_SECURE_OBJECT权限
CREATE FUNCTION(已编译的SQL标量)的语法
参数声明:
参数类型:
数据类型:
内置类型:
功能定义
SQL-routine-body:
选项列表 :(选项列表中的选项可以任意排序,但每个选项只能出现一次)
CREATE FUNCTION(已编译的SQL标量)描述
- 功能名称
- 命名函数。 如果函数名称已经存在,且具有指定的签名,即使指定了与函数名称中指定的函数现有版本标识符不同的常规版本标识符 ,也会返回错误。 更多信息,请参阅 CREATE FUNCTION语句(概述 )中的
选择架构和函数名称
以及确定架构中函数的唯一性
。 - (参数声明 ……)
指定函数的输入参数数量以及每个参数的名称和数据类型。 每个参数声明都指定了函数的输入参数。 一个函数可以有零个或多个输入参数。 函数期望接收的每个参数列表中必须有一个条目。 函数的全部参数均为输入参数,且可为空。 如果函数有30个以上的参数,则仅使用前30个参数来确定函数是否唯一。
- 参数名称
- 指定输入参数的名称。 该名称是SQL标识符,参数列表中的每个名称不得与其他名称相同。
- data-type
- 指定输入参数的数据类型。 数据类型可以是内置数据类型,也可以是用户自定义类型。
- 内置式
- 输入参数的数据类型是内置数据类型。 有关内置数据类型的说明,请参阅 CREATE TABLE 语句中的数据类型和 built-in-type 的说明。
对于字符或图形数据类型的参数,PARAMETER CCSID子句或CCSID子句指示参数的编码方案。 如果您没有指定这两个条款中的任何一个,编码方案就是安装面板 DSNTIPF 上的字段 DEF ENCODING SCHEME 的值。
- distinct-type-name
- 输入参数的数据类型是不同的类型。 参数的任何长度、精度、比例、子类型或编码方案属性都是不同类型的源类型属性。 该特殊类型不能基于LOB数据类型。
如果您指定了唯一类型的名称而没有模式名称, Db2 将通过在SQL路径中搜索模式来解析唯一类型。
- TABLE LIKE 表名 AS LOCATOR
- 指定参数为转换表。 然而,当函数被调用时,转换表中的实际值不会传递给函数。 而是传递一个单一的值。 该值是表的定位符,函数使用它来访问转换表的列。 已标识的表可以包含XML列,但函数不能引用这些XML列。
带表参数的函数只能从触发器的触发操作中调用。
- 数组类型名称
- 输入参数的数据类型为用户定义的数组类型。
如果您指定了数组类型名称而没有模式名称, Db2 将通过在SQL路径中搜索模式来解析数组类型。
所有参数的隐式或显式编码方案(字符或图形字符串数据类型)必须相同——要么全部为ASCII,要么全部为EBCDIC,要么全部为UNICODE。
虽然字符数据类型的参数具有隐式或显式指定的子类型(BIT、SBCS或MIXED),但函数程序可以接收任何子类型的字符数据。 因此,在调用函数时,输入数据可能会转换为参数的子类型。 如果将实际包含DBCS字符的混合数据用作以SBCS子类型声明的输入参数的值,则会发生错误。
日期时间数据类型或不同类型的参数将以不同数据类型的形式传递给函数:
- 日期时间类型参数以字符数据类型传递,数据以ISO格式传递。
日期时间类型参数的编码方案与任何字符或图形字符串参数的隐式或显式编码方案相同。 如果没有传递字符串或图形字符串参数,则编码方案为安装面板 DSNTIPF 上的字段 DEF ENCODING SCHEME 的值。
- 一个不同的类型参数作为不同类型的源类型传递。
- RETURNS
- 确定函数的输出。
- data-type2
- 指定输出的数据类型。 输出结果可以为空。
在数据类型下描述的输入参数数据类型考虑因素同样适用于函数输出的数据类型。
- VERSION 常规版本ID
- 指定要生成的第一个函数版本的版本标识符。 您可以使用带有ADD VERSION子句的ALTER FUNCTION语句或BIND DEPLOY命令来创建函数的其他版本。
- 常规版本ID
- 一个最多包含64个EBCDIC字节的SQL标识符,用于指定例程的版本。 UTF-8 标识符的长度不得超过122字节。
V1 是默认版本标识符。
- LANGUAGE SQL
- 指定函数仅以SQL编写。
- SPECIFIC 专有名词
- 指定函数的唯一名称。 名称隐含或明确地带有模式名称。 名称(包括架构名称)不得与当前服务器上存在的其他函数的特定名称相同。
非限定格式的 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)中使用。 但是,不能通过其特定名称来调用该函数。
- NOT DETERMINISTIC 或者 DETERMINISTIC
- 指定每次使用相同的输入自变量调用函数时函数是否返回相同的结果。
- NOT DETERMINISTIC
- 当使用相同的输入参数调用函数时,函数可能不会每次返回相同的结果。 函数取决于一些影响结果的状态值。 Db2 在处理引用此函数的 SELECT 和 SQL 数据更改语句 时,使用此信息来禁止合并视图和表表达式。 生成随机数的函数就是一个非确定性函数的例子。
如果函数程序访问特殊寄存器或调用另一个非确定性函数,则必须明确或隐含地指定NOT DETERMINISTIC。 默认值为“非确定性”。
- DETERMINISTIC
- 每次使用相同的输入参数调用函数时,函数总是返回相同的结果。 确定性函数的例子是计算输入的平方根的函数。 Db2 使用这些信息合并引用此函数的 SELECT 和 SQL 数据更改语句的视图和表表达式。 “确定论”并非默认选项。 如果适用,请指定“确定性”,以防止为引用此函数的 SQL 语句选择非最佳访问路径。
Db2 不验证功能程序是否符合确定性或非确定性的规范。
- EXTERNAL ACTION 或者 NO EXTERNAL ACTION
- 指定函数是否执行操作,以改变 Db2 不管理的对象的状态。 外部操作的一个示例是发送消息或将记录写入文件。
- EXTERNAL ACTION
- 该函数可以采取行动,改变 Db2 不管理的对象的状态。
如果并行任务执行函数,某些调用具有外部操作的函数的SQL语句可能会导致结果不正确。 例如,如果函数为每个初始调用发送一个注释,则为每个并行任务发送一个注释,而不是为函数发送一个注释。 对于无法正常并行运行的函数,请指定“不允许并行”子句。
如果您指定外部操作,则发送至 Db2 :
- 在引用函数的SELECT和SQL数据更改语句中实现视图和表表达式。 这种具体化可能会对引用该函数的SQL语句的访问路径产生不利影响。 如果功能没有外部动作,请不要指定外部动作。
- 在FETCH操作之间,不会将功能从一个任务控制块(TCB)移动到另一个任务控制块。
- 在关闭光标之前,不允许其他函数或存储过程使用TCB。 这也适用于被声明为“保留”的游标。
在 Db2 之外,资源所做的唯一改变是在提交和回滚操作的控制下,在RRS控制下所做的那些改变。
如果SQL例程调用一个使用EXTERNAL ACTION定义的函数,则必须隐式或显式指定EXTERNAL ACTION。 默认情况下,外部操作处于启用状态。
- NO EXTERNAL ACTION
- 该函数不会采取任何行动来改变 Db2 不管理的对象的状态。 Db2 使用这些信息合并引用此函数的 SELECT 和 SQL 数据更改语句的视图和表表达式。 如果适用,请指定“无外部操作”,以防止为引用此函数的 SQL 语句选择非最佳访问路径。
虽然全局变量的范围超出了常规,但在指定了“无外部操作”时,可以在常规主体中设置全局变量。
Db2 不验证功能程序是否符合外部动作或无外部动作的规范。
- MODIFIES SQL DATA, 读取SQL数据 ,或 CONTAINS SQL
- 指定此例程可以执行或调用的SQL语句和嵌套例程的分类。 数据库管理员负责验证函数发出的SQL语句以及本地调用的所有例程是否符合规范;当调用嵌套的远程例程时,不会进行验证。 有关每条语句的分类,请参阅例程的SQL语句数据访问分类。
- MODIFIES SQL DATA
指定函数可以执行任何SQL语句,但不支持函数不支持的语句。 当ALLOW PARALLEL生效时,不要指定MODIFIES SQL DATA。
如果使用 MODIFIES SQL DATA 定义的函数被调用到除最外层 SELECT 语句的 select-clause 之外的任何地方,结果都是不可预测的,因为根据所使用的访问计划,函数可能会被多次调用。
建议如果 SELECT 语句调用了使用
MODIFIES SQL DATA
选项定义的函数,请确保嵌套在该函数内部的语句不会修改任何嵌套级别更高的 SQL 语句中引用的对象。 否则,很可能出现不可预测的结果。- 读取 SQL 数据
- 指定函数可以执行数据访问分类为“读取SQL数据”、“包含SQL”或“非SQL”的语句。 该功能无法执行修改数据的SQL语句。
读取SQL数据是默认设置。
- CONTAINS SQL
- 指定该函数只能执行数据访问分类为CONTAINS SQL或NO SQL的SQL语句。 该功能无法执行读取或修改数据的SQL语句。
- 调用空输入或 RETURNS NULL ON NULL INPUT
- 指定在执行时,如果任何输入参数为空,是否调用该函数。
- 调用空输入
- 指定当参数值为空时(无论是否为全部)调用该函数。 指定“调用空输入”意味着必须对函数主体进行编码,以测试空参数值。
默认值为 “调用空输入 ”。
- RETURNS NULL ON NULL INPUT
- 指定不调用该函数,如果任何输入参数值为空,则返回空值。
- 静态调度
- 在函数解析时, Db2 会根据函数参数的静态(或声明的)类型来选择函数。 默认值为静态调度。
- ALLOW PARALLEL 或者 DISALLOW PARALLEL
- 指定函数是否可以并行运行。 默认值为“不允许并行”,如果您指定以下一个或多个条款:
- NOT DETERMINISTIC
- EXTERNAL ACTION
- MODIFIES SQL DATA
否则,默认设置为“允许并行”。
- ALLOW PARALLEL
- 指定函数可以并行运行。
- DISALLOW PARALLEL
- 指定函数不能并行运行。
- ALLOW DEBUG MODE、 DISALLOW DEBUG MODE或 DISABLE DEBUG MODE
- 指定此版本的例程是否可以在调试模式下运行。 默认值由当前调试模式特殊寄存器的值决定。
- ALLOW DEBUG MODE
- 指定此版本的例程可在调试模式下运行。 当调用此版本的例程并尝试调试时,必须有一个WLM环境可用。
- DISALLOW DEBUG MODE
- 指定此版本的例程不能在调试模式下运行。
您可以使用ALTER语句将此选项更改为ALLOW DEBUG MODE,用于此初始版本的例程。
- DISABLE DEBUG MODE
- 指定此版本的例程不能在调试模式下运行。
在创建或更改此版本的例程以使用禁用调试模式后,无法更改此版本的例程以指定允许调试模式或禁用调试模式。 要更改此选项,请删除该例程,然后使用所需的选项重新创建。 除了删除并重新创建例程之外,还可以创建一个使用所需选项的例程版本,并将其设置为活动版本。
当禁用调试模式生效时,调试模式的WLM环境将被忽略。
- PARAMETER CCSID
- 指定字符或图形字符串参数的编码方案为ASCII、EBCDIC或UNICODE。 默认编码方案是指在参数列表的CCSID子句或RETURNS子句中指定的值,或在安装面板DSNTIPF的DEF ENCODING SCHEME字段中指定的值。
该条款为指定字符或图形字符串参数的编码方案提供了便利。 如果除了此 PARAMETER CCSID 条款外,还为单个参数指定了单独的 CCSID 条款,则所有 CCSID 条款中指定的值必须与此条款中指定的值相同。 该条款还规定了用于系统生成的常规参数的编码方案,例如消息标记和DBINFO。
如果参数的数据类型是用户定义的字符串或图形类型,则该字符串或图形类型的CCSID必须与此子句中指定的值相同。
如果参数的数据类型是用户定义的数组类型,且该类型由字符或图形字符串数组元素或字符串数组索引定义,则这些数组属性的 CCSID 必须与此子句中指定的值相同。
该条款还规定了用于系统生成的常规参数的编码方案。
- QUALIFIER 模式名称
- 指定隐式限定符,用于在过程体中引用的非限定对象名称。 有关如何确定此选项的默认值的信息,请参阅非限定别名、索引、JAR文件、掩码、权限、序列、表、触发器和视图名称。
- PACKAGE OWNER 授权名称
- 指定与例程版本关联的包的所有者。 进程的SQL授权ID为默认值。
- ASUTIME
- 以CPU服务单元为单位,指定单个例程调用可以运行的总处理器时间。 该值与资源限制规格表的 ASUTIME 列无关。
当您正在调试一个程序时,如果程序陷入循环,设置一个限制可能会有所帮助。 有关服务单元的信息,请参阅 z/OS MVS Initialization and Tuning Guide。
- 无限制
- 规定服务单元没有限制。
默认值为 “无限制 ”。
- LIMIT 整数
- CPU服务单元的数量限制为1-2 147 483 647之间的正整数。 如果程序使用的服务单元数量超过指定值, Db2 将取消该程序。 在程序中,并行任务所消耗的CPU周期不计入指定的ASUTIME LIMIT。
- 继承特殊登记或 DEFAULT SPECIAL REGISTERS
- 指定在进入例程时如何设置特殊寄存器。
- WLM ENVIRONMENT FOR DEBUG MODE 名字
- 指定 Db2 在调试程序时使用的WLM(工作负载管理器)应用程序环境。 WLM环境名称是一个SQL标识符。
如果您没有指定调试模式的WLM环境, Db2 将使用安装时指定的默认WLM存储过程地址空间。
您必须拥有WLM应用环境的相应权限。
当禁用调试模式时,调试模式下的WLM环境值将被忽略。
- CURRENT DATA YES 或当前数据 无
- 指定当游标稳定性隔离级别生效时,是否要求只读和模糊游标的数据保持最新。 当前数据还决定着块获取是否可用于分布式、模糊游标。
- CURRENT DATA YES
- 指定只读和模糊游标需要数据货币。 Db2 已获取页面或行锁以确保数据更新。 对于分布式、模糊游标,块获取将被忽略。
- 当前数据 无
- 指定只读和模糊游标不需要数据货币。 对于分布式、模糊游标,允许块获取。 如果常规操作试图在打开模糊游标后动态准备并执行DELETE WHERE CURRENT OF语句,则不建议使用 CURRENT DATA NO。 如果您的常规语句试图对以下游标使用DELETE WHERE CURRENT OF语句,则会收到负SQLCODE:
- 正在使用块获取的光标
- 使用并行性查询的游标
- 放置在由此或另一个应用程序进程修改的行上的游标
当前数据编号为默认值。
- DEGREE
- 指定是否尝试使用并行处理来运行查询,以最大限度地提高性能。
- 1
- 指定不应使用并行处理。
1是默认值。
- 任何
- 指定可以使用并行处理。
- CONCURRENT ACCESS RESOLUTION
- 指定处理是否仅使用已提交的数据,还是等待正在更新中的数据的提交或回滚。
- WAIT FOR OUTCOME
- 指定处理将等待正在更新中的数据的提交或回滚。
- USE CURRENTLY COMMITTED
- 指定当遇到正在更新的数据时,处理过程使用当前提交的数据版本。 USE
CURRENTLY COMMITTED 适用于访问通用表空间中定义的表的扫描,这些表具有行级或页级锁定大小。
当读取事务和插入事务之间存在锁争用时, USE CURRENTLY COMMITTED 适用于隔离级别为CS或RS的扫描。 适用的扫描包括针对只读和模糊查询以及可更新游标的意向读取扫描。 USE CURRENTLY COMMITTED 也适用于从UPDATE或DELETE语句的WHERE子句和INSERT语句的子选择中启动的扫描。
当读事务和删除事务之间存在锁争用时, USE CURRENTLY COMMITTED 适用于隔离级别为CS且指定了CURRENT DATA NO的扫描。
- DYNAMICRULES
- 指定在运行时对以下动态 SQL 属性适用的值:
- 用于检查授权的授权标识
- 用于不合格对象的限定符
- Db2 用于解析和语义验证动态SQL语句的应用程序编程选项的源文件
DYNAMICRULES还指定动态SQL语句是否可以包含GRANT、REVOKE、ALTER、CREATE、DROP和RENAME语句。
除了DYNAMICRULES条款的价值外,例程的运行时环境还控制动态SQL语句在运行时的行为。 DYNAMICRULES值和运行环境共同决定了动态SQL属性的值。 该组属性值被称为动态 SQL 语句行为。 可以指定下列值:- 运行
- 指定动态 SQL 语句将使用运行行为进行处理。
默认值为“运行 ”。
- BIND
- 指定动态 SQL 语句将使用绑定行为进行处理。
- DEFINEBIND
- 指定动态 SQL 语句将使用定义行为或绑定行为进行处理。
- DEFINERUN
- 指定动态 SQL 语句将使用定义行为或运行行为进行处理。
- INVOKEBIND
- 指定动态 SQL 语句将使用调用行为或绑定行为进行处理。
- INVOKERUN
- 指定动态 SQL 语句使用调用行为或运行行为进行处理。
- APPLICATION ENCODING SCHEME
- 指定例程主体中静态 SQL 语句中 SQL 变量的默认编码方案。 如果未指定CCSID子句作为数据类型的一部分,且未指定参数CCSID例程选项,则该值用于在复合语句中定义SQL变量。
- ASCII
- 指定使用服务器的ASCII CCSID对数据进行编码。
- EBCDIC
- 指定使用服务器的EBCDIC CCSID对数据进行编码。
- UNICODE
- 指定使用服务器的Unicode CCSID对数据进行编码。
有关如何确定此选项的默认值的信息,请参阅 ENCODING 绑定选项中的 ENCODING 绑定选项。
- WITH EXPLAIN 或无需解释
- 指定是否提供有关例程中SQL语句如何执行的信息。
- 无需解释
- 指定不提供有关例程中的SQL语句如何执行的信息。
如果语句嵌入在用WITHOUT EXPLAIN指定的例程中,则可以通过在例程主体中嵌入SQL语句EXPLAIN来获得该语句的EXPLAIN输出。 否则,EXPLAIN选项适用于例程主体中的所有可解释的SQL语句,以及任何DECLARE CURSOR语句的fullselect部分。
默认值为 “无解释 ”。
- WITH EXPLAIN
- 指定提供有关例程中SQL语句如何执行的信息。 信息被插入到表所有者.PLAN_TABLE中。 owner 是例程所有者的授权ID。 或者,例程所有者的授权ID可以有一个别名, 例如owner.PLAN_TABLE ,指向基础表PLAN_TABLE。 所有者还必须对该表拥有适当的 SELECT 和 INSERT 权限。 WITH EXPLAIN不会获取访问远程对象的语句的信息。 PLAN_TABLE必须有一个基本表,可以有多个别名,表名相同,但结构限定符不同。
它不能是视图或同义词,并且应在处理 CREATE 语句之前就存在。
在所有对 owner.PLAN_TABLE 的插入中,QUERYNO 的值是 分配的语句编号。 Db2
如果存在DSN_STATEMNT_TABLE和DSN_FUNCTION_TABLE两个可选表,则WITH EXPLAIN选项也会填充这两个表。 DSN_STATEMNT_TABLE包含SQL语句的处理成本估算,DSN_FUNCTION_TABLE包含函数解析的信息。 更多信息,请参见 EXPLAIN表。
有关 EXPLAIN 语句的更多信息,包括 WITH EXPLAIN 选项填充的表的说明,请参阅 EXPLAIN 语句。
- WITH IMMEDIATE WRITE 或无需立即撰写
- 指定是否对组缓冲池相关页面集或分区进行更新时立即写入。 此选项仅适用于数据共享环境。 即时写入子系统参数不影响此选项。 即时写入绑定选项显示了即时写入绑定选项(与常规选项类似)的隐含层次结构,因为它会影响运行时间。
- 无需立即撰写
- 指定执行正常的写入活动。 依赖于组缓冲池的更新页面在提交的第一阶段或之前写入,或者对于已回滚的事务,在中止结束时写入。
默认值为 “不立即写入 ”。
- WITH IMMEDIATE WRITE
- 指定一旦缓冲区更新完成,立即写入依赖于组缓冲池的更新页面。 即使缓冲区在事务处理前进或回滚期间更新,更新的页面也会立即写入。 WITH IMMEDIATE WRITE 可能会影响性能。
- ISOLATION LEVEL RR、 RS、CS 或 UR
- 指定程序与正在运行的其他应用程序的影响隔离的程度。 如需了解隔音等级信息,请参阅 “选择隔音选项 ”。
- RR
- 指定可重复读取。
- RS
- 指定读取稳定性。
- CS
- 指定光标稳定性。 CS 是默认设置。
- UR
- 指定未承诺的阅读。
- OPTHINT 'hint-id '
- 指定是否将查询优化提示用于例程主体中包含的静态 SQL 语句。
hint-id 是一个长度不超过128字节的字符串, Db2 子系统在PLAN_TABLE中搜索行作为输入时使用。 默认值为空字符串(''),表示 Db2 子系统不对静态SQL语句使用优化提示。
优化提示仅在您的系统启用了优化提示时可用。 更多信息,请参阅 “优化提示”字段(OPTHINTS子系统参数 )。
SQL PATH
指定 Db2 子系统用于解析例程正文中(CALL 语句中)未限定的用户定义数据类型、函数和存储过程名称的 SQL 路径。 默认值为 “SYSIBM”、“SYSFUN”、“SYSPROC”、“SYSIBMADM ”,QUALIFIER选项的值是语句目标的触发器的限定符。 SQL路径的最大长度为2048字节。 Db2 通过以下方式计算长度:取指定的每个模式名称 ,去掉其末尾的空白,在左右两侧添加分隔符,并在每个模式名称后添加一个逗号,但最后一个名称除外。 生成的字符串长度不能超过2048字节。
- schema-name
- 标识模式。 Db2 在处理CREATE语句时,不会验证模式是否存在。 同一个模式名称不应在模式名称列表中出现两次以上。
SYSPUBLIC不能指定为SQL路径。
- SYSTEM PATH
- 指定架构名称 “SYSIBM”、“SYSFUN”、“SYSPROC”、“SYSIBMADM ”。
- SESSION_USER 或者 USER
- 指定 SESSION_USER(或 USER)特殊寄存器的值。 在处理CREATE语句时,实际长度包含在为SQL PATH选项指定的模式名称列表的总长度中。
- REOPT
- 指定 Db2 是否将在运行时使用SQL变量或SQL参数、参数标记和特殊寄存器的值来确定访问路径。
- None
- 指定 Db2 不会在运行时通过SQL变量或SQL参数、参数标记和特殊寄存器的值来确定访问路径。
默认值为无。
- ALWAYS
- 指定每次运行SQL语句时, Db2 始终决定运行时的访问路径。 不要在WITH KEEP DYNAMIC或NODEFER PREPARE子句中指定REOPT ALWAYS。
- ONCE
- 指定 Db2 仅在第一次打开动态SQL语句时确定一次访问路径。 这条访问路径一直可用,直到预编译语句失效或被从动态语句缓存中移除,需要重新预编译。
- 查询 加速
- 指定是否对静态SQL查询进行加速,如果是,则指定加速行为。
- 无
- 指定应用程序中的静态SQL查询不会绑定加速,也不会在应用程序运行时加速。
- ENABLE
- 指定静态SQL查询在满足加速条件(包括成本和启发式条件)时进行加速。 当应用程序运行时,查询将发送至加速器。 否则,如果静态查询不符合加速标准,则查询将在 Db2 中执行。
如果在应用程序运行时执行加速静态查询时出现错误情况(例如以下示例中的情况), Db2 将失败,并向应用程序返回负SQL代码:
- 在加速器上运行静态查询时出现故障。
- 查询时,加速器返回错误。
- 加速器未启动, Db2 无法将静态查询路由到加速器执行。
- 启用(带故障恢复)
- 结果与ENABLE 相同,除非在应用程序运行时,加速静态查询首次打开时出现错误条件。 在这种情况下, Db2 不会让静态查询失败并向应用程序返回负面的SQL代码,而是对查询执行临时语句级增量绑定,并在 Db2 中运行查询。 应用程序没有发现加速故障。 当应用程序成功打开加速器查询后,无法再发送电子邮件至 Db2 。
- 合格
- 指定如果静态SQL查询满足基本加速条件,则无论代价或启发式条件如何,都将加速该查询。 当应用程序运行时,查询将发送至加速器。
与ENABLE 的行为一样,如果在应用程序运行时执行加速静态查询时出现错误, Db2 将失败,并向应用程序返回负SQL代码。
- 全部
- 指定应用程序中的所有静态SQL查询在应用程序运行时绑定到加速器并路由到加速器。 如果 Db2 确定静态查询无法绑定到加速器上运行,并且查询引用了用户基础表或视图,则BIND或REBIND PACKAGE操作将失败,并显示该查询的错误消息。 (已声明的全局临时表(DGTT)和已创建的全局临时表(CGTT)除外,因为这些表无法加速。)
与ENABLE 的行为一样,如果在应用程序运行时执行加速静态查询时出现错误, Db2 将失败,并向应用程序返回负SQL代码。
此绑定选项不适用于在例程的 RETURN 语句中指定的 fullselect 或 WITH 共用表表达式 ,也不适用于在例程中使用的 SET 主机变量赋值。 在这种情况下,无法加速查询。
- get_accel_archive
- 指定用于加速的静态SQL查询是否检索加速器上的存档数据,而不是活动数据。
- 否
- 指定不使用静态SQL查询从加速器中检索已归档的数据。 如果静态查询也不需要加速,则查询将在 Db2 中运行。
如果静态查询因指定了QUERYACCELERATION绑定选项而需要加速,则当应用程序运行时,查询将发送到加速器;但是,查询不会检索任何存档数据。
- YES
- 指定如果满足以下所有条件,则查询将加速,并在应用程序运行时检索加速器上的存档数据:
- QUERYACCELERATION绑定选项也已指定。
- 静态SQL查询引用了加速表,该表将分区数据存档在加速器上。
- 静态查询满足QUERYACCELERATION绑定选项指定的加速条件。
如果静态查询不符合QUERYACCELERATION绑定选项指定的加速条件,则BIND或REBIND PACKAGE操作将失败,并显示该查询的错误消息。
此绑定选项不适用于在例程的 RETURN 语句中指定的 fullselect 或 WITH 共用表表达式 ,也不适用于在例程中使用的 SET 主机变量赋值。 在这种情况下,无法加速查询。
加速度
指定加速器在等待复制 Db2 运行查询之前发生的已提交 Db2 数据更改时延迟查询的最长时间(如果有)。
对于静态加速查询,您还必须将此函数或过程的QUERYACCELERATION绑定选项设置为NONE以外的合法值,以请求加速静态查询。 如果QUERYACCELERATION绑定选项值设置为NONE,则ACCELERATIONWAITFORDATA绑定选项将被接受,并且程序包将绑定该选项值;但是,该选项将不适用于静态SQL查询,因为不会加速任何静态查询。
对于动态加速查询,指定加速等待数据绑定选项也会初始化当前查询加速等待数据特殊寄存器,该寄存器用于 Db2 函数或过程中的动态查询,前提是函数或过程选项默认特殊寄存器也被使用。 将当前查询加速等待数据初始化为大于0的值,指定 Db2 和加速器将对所有由 Db2 函数或过程加速的动态SQL查询应用等待数据延迟行为和限制。 当前查询加速特殊寄存器必须具有除“无”以外的其它有效值,才能请求加速动态查询。
- nnnn.m
- 指定一个 DECIMAL(5,1) 数字常量值,该值指定在加速器等待复制在 Db2 运行查询之前发生的已提交 Db2 数据更改时,加速器将延迟查询的最大秒数。
您可以指定一个介于 0.0 到 3600.0 秒之间的值。 例如, 20.0 表示 20.0 秒(或 20000 毫秒),而 30.5 表示 30.5 秒(或 30500 毫秒)。 3600.0 的最大值表示查询延迟了3600秒。
您也可以指定一个介于0-3600秒之间的整数常数值, Db2 会将该值转换为DECIMAL(5,1)值。
重要 :当为 ACCELERATIONWAITFORDATA 绑定选项指定非零值时, Db2 和加速器将对应用程序包加速的所有查询应用其他 WAITFORDATA 延迟行为、限制和要求。 这些行为、限制和要求可能会导致以前成功加速的查询不再加速或失败。 请参阅 SET CURRENT QUERY ACCELERATION WAITFORDATA语句 ,了解有关WAITFORDATA行为、限制和要求的更多信息。加速器
指定一个加速器服务器,如果该服务器已启用且可用, Db2 会将其视为符合条件的 SQL 查询的首选加速器,然后再将查询发送到其他加速器服务器。 如果指定的加速器服务器未启用或不可用, Db2 将把查询发送到其他可用的加速器服务器。
- 确认运行或 VALIDATE BIND
- 指定是否在运行时重新检查绑定或重新绑定期间发现的“未找到对象”和“未授权”类型的错误。 如果所有对象和所需权限都已存在,则该选项不起作用。
- 验证运行
- 指定当处理CREATE语句时,如果所需对象或权限不存在,则返回警告消息,但CREATE语句成功。 Db2 子系统会在运行时对那些在处理CREATE语句时未能通过检查的SQL语句的对象和权限进行重新检查。 授权检查例程所有者授权ID的使用情况。
默认值为 “验证运行 ”。
- VALIDATE BIND
- 指定如果在处理CREATE语句时所需的对象或权限不存在,则发出错误并导致CREATE语句失败。
- ROUNDING
- 指定处理DECFLOAT数据的舍入模式。 默认值来自DECP中的默认十进制浮点舍入模式。
- DEC_ROUND_CEILING
- 指定数字取整为正无穷大。
- DEC_ROUND_DOWN
- 指定数字四舍五入为0(截断)。
- DEC_ROUND_FLOOR
- 指定数字舍入为负无穷大。
- DEC_ROUND_HALF_DOWN
- 指定数字四舍五入取整;如果等距,则向下取整。
- DEC_ROUND_HALF_EVEN
- 指定数字四舍五入取整;如果等距,则四舍五入取整,使最后一位数字为偶数。
- DEC_ROUND_HALF_UP
- 指定数字四舍五入取整;如果等距,则向上取整。
- DEC_ROUND_UP
- 指定数字舍入到0以外。
- DATE FORMAT ISO, EUR , USA , JIS ,或 LOCAL
- 指定日期或时间值的字符串表示形式的结果值的日期格式。 更多信息,请参阅日期时间值的字符串表示。
默认格式在定义例程的系统安装面板 DSNTIP4 的日期格式字段中指定。 除非您有日期退出程序,否则无法使用“本地”选项。
- DECIMAL(15 ) , DECIMAL(31 ) , DECIMAL(15 , s ) ,或 DECIMAL(31 , 秒 )
- 指定十进制算术运算的最大精度。 更多信息请参阅 《两位小数运算的算术 》。 默认格式在定义例程的系统安装面板 DSNTIPF 的 DECIMAL ARITHMETIC 字段中指定。 如果指定了 pp. s 形式, 则 s 必须是 1-9 范围内的数字。s 表示用于除法的最小小数位数。
- FOR UPDATE CLAUSE OPTIONAL 或需要更新条款
- 指定如果游标用于执行定位更新,则DECLARE CURSOR语句是否需要FOR UPDATE子句。
- 需要更新条款
- 规定如果游标将用于定位更新,则必须将FOR UPDATE子句作为游标定义的一部分。
默认情况下, 需要更新条款。
- FOR UPDATE CLAUSE OPTIONAL
- 指定在定位更新中使用游标时,无需指定 FOR UPDATE 子句。 常规主体可以包含定位UPDATE语句,用于更新用户有权限更新的列。
- TIME FORMAT ISO, EUR , USA , JIS ,或 LOCAL
- 指定日期或时间值的字符串表示形式结果值的时间格式。 更多信息,请参阅日期时间值的字符串表示。
默认格式在定义例程的系统安装面板 DSNTIP4 的“时间格式”字段中指定。 除非您有日期退出程序,否则无法使用“本地”选项。
- NOT SECURED 或者 SECURED
- 指定该功能在行访问控制和列访问控制中是否安全。 “安全”或“不安全”选项适用于该功能的所有未来版本。
- NOT SECURED
- 指定该功能在行访问控制和列访问控制方面不安全。
NOT SECURED 是默认值。
当调用函数时,如果表使用活动列访问控制,则函数的参数不得引用启用列掩码的列。
- SECURED
- 指定该功能在行访问控制和列访问控制中是安全的。
当在行权限或列掩码中引用函数时,函数必须安全。
- BUSINESS_TIME SENSITIVE
- 确定静态和动态 SQL 语句中对应用期间临时表的引用是否受 CURRENT TEMPORAL BUSINESS_TIME 特殊寄存器的值影响。
- YES
- 对申请期间临时表的引用受当前临时业务时间特殊寄存器的值的影响。 缺省值是 YES。
- NO
- 对申请期间临时表的引用不受当前临时业务时间特殊寄存器的值的影响。
更多信息,请参阅当前时间业务时间特别登记册。
- SYSTEM_TIME SENSITIVE
- 确定静态和动态 SQL 语句中对系统周期临时表的引用是否受 CURRENT TEMPORAL SYSTEM_TIME 特殊寄存器的值影响。
- YES
- 对系统周期时态表的引用会受CURRENT TEMPORAL SYSTEM_TIME专用寄存器的值影响。 缺省值是 YES。
- NO
- 对系统周期时态表的引用不会受CURRENT TEMPORAL SYSTEM_TIME专用寄存器的值影响。
更多信息,请参阅当前时间系统_时间特殊寄存器。
- ARCHIVE SENSITIVE
- 确定SQL语句中对启用存档的表的引用是否受 SYSIBMADM.GET_ARCHIVE 内置全局变量值的影响。
- YES
- 对启用存档的表的引用受 SYSIBMADM.GET_ARCHIVE 内置全局变量值的影响。 缺省值是 YES。
- NO
- 对启用存档的表的引用不受 SYSIBMADM.GET_ARCHIVE 内置全局变量值的影响。
相关信息请参阅 GET_ARCHIVE内置全局变量
APPLCOMPAT Appcompat-level
指定软件包中静态 SQL 语句的应用程序兼容级别行为。 如果未指定此选项,则由APPLCOMPAT子系统参数决定行为。 可以指定以下应用兼容级别值:
VvvRrMmmm
与已识别的 Db2 功能级别的行为兼容。 例如,
V12R1M510
指定与最高可用 Db2 12 功能级别的兼容性。 必须启用等效或更高功能级别。提示:对于使用数据服务器客户端或驱动程序访问 Db2 for z/OS® 的应用程序,可能需要额外的程序准备步骤来提高应用程序兼容性级别。 有关详细信息,请参阅为数据服务器客户端和驱动程序设置应用程序兼容性级别。
V12R1
与 Db2 12 功能 500 级的行为兼容。 该值与指定
V12R1M500
的结果相同。- V11R1
- 与 Db2 11 新功能模式的行为兼容。 迁移到 Db2 12 后,此值与指定
V12R1M100
具有相同的结果。 欲了解更多信息,请访问 V11R1 应用程序兼容性级别 - V10R1
- 与 DB2® 10 新功能模式的行为兼容。 更多信息,请参阅 V10R1 应用程序兼容性级别。
浓缩语句或浓缩语句中的词汇
FL 500 指定例程中指定字面常量的每条动态 SQL 语句是否作为单独的唯一语句条目缓存在动态语句缓存中,而不是共享缓存中的现有语句。 如果新语句满足共享同一动态语句缓存版本的所有条件,则动态 SQL 语句有资格共享缓存中的现有语句,但新语句指定的一个或多个字面常量必须与缓存语句不同。
- 集中陈述 OFF
指定每个动态SQL语句,如果指定一个或多个与同一动态语句的缓存版本不同的常量,则该语句将被缓存为唯一的语句条目。 集中式语句 OFF 是默认的动态语句缓存行为。
- 用文字浓缩语句
指定每个指定文字常量的动态 SQL 语句将共享同一个动态语句的缓存版本,该动态语句也是使用 CONCENTRATE STATEMENTS WITH LITERALS 选项准备的,前提是新的动态语句满足共享缓存语句的所有条件,并且指定的常量可以代替缓存语句中的常量重复使用。
- SQL 常规语句主体
- 指定单个SQL控制语句,包括复合语句。 有关定义SQL函数的更多信息,请参阅 SQL程序语言(SQL PL )。
如果SQL函数调用一个过程,而该过程发出COMMIT、ROLLBACK、CONNECT、RELEASE或SET CONNECTION语句,则会产生错误。
如果 SQL例程主体是一个复合语句,则必须至少包含一个RETURN语句,并且在调用函数时必须执行RETURN语句。
SQL 例程主体不得包含句点说明或句点子句。
在SQL例程主体中不允许使用带有ADD VERSION子句或REPLACE子句的ALTER FUNCTION(已编译的SQL标量)语句或ALTER PROCEDURE(SQL原生)语句。
WRAPPED obfuscated-statement-text
FL 500指定函数的编码定义。 CREATE FUNCTION 语句可以使用 WRAP 标量函数进行编码。
WRAPPED 不能在静态 CREATE 语句中指定。
CREATE FUNCTION(编译的SQL标量)的注释
- 所有类型的用户自定义功能注意事项:
- 有关适用于所有类型用户定义函数的注意事项,请参阅 CREATE FUNCTION语句(概述 )。
SQL 标量函数类型
如果 CREATE FUNCTION 语句的语法符合 CREATE FUNCTION(内联 SQL 标量)的语法图和说明, Db2 定义了内联函数,则不会创建包。 当调用内联的SQL标量函数时,函数RETURN语句中的表达式会被复制(内联)到查询语句中,而函数本身不会被调用。 内联SQL标量函数的属性在CREATE FUNCTION语句(内联SQL标量函数) 中进行了描述。
否则, Db2 会尝试使用关联包定义编译函数。 例如,如果RETURN语句包含标量全选, Db2 将尝试定义一个编译函数。 已编译 SQL 标量函数的属性在 CREATE FUNCTION 语句(已编译 SQL 标量函数) 中描述。
要确定创建的是哪种类型的SQL标量函数,请参阅 SYSIBM.SYSROUTINES 目录表的INLINE列。 在INLINE列中,Y表示该函数为内联函数,N表示该函数为编译函数。
使用 MODIFIES SQL DATA 定义的函数的注意事项:
如果在子选择中指定了一个函数,且该函数定义为 MODIFIES SQL DATA,则调用该函数的次数将根据所使用的访问计划而有所不同。
- 自引用功能:
- SQL函数的主体(即CREATE FUNCTION语句主体中的RETURN语句中的表达式或NULL)不能包含对自身或调用它的另一个函数的递归调用,因为这样的函数不存在,无法引用。
- 从属对象:
- SQL 例程依赖于例程主体中引用的对象。
混淆视听的发言:
CREATE FUNCTION 语句可以混淆形式执行。 在一段晦涩难懂的语句中,只有函数名称、参数和WRAPPED关键字可以读出。 该语句的其余部分将以不可读方式进行编码,但支持模糊语句的数据库服务器可以解码该部分。 WRAP标量函数生成混淆语句。 根据混淆语句创建函数时指定的任何调试选项都将被忽略。
- 识别码解析:
- 有关如何在SQL程序中将名称解析为列、变量或SQL参数的信息,请参阅 SQL程序语言(SQL PL )。
如果列、变量和参数使用了重复的名称,请使用列的表名、参数的例程名、SQL变量的标签名和全局变量的模式名来限定重复的名称。
- SQL函数中的错误处理:
- 您应该考虑在已编译的SQL函数中,每个SQL语句可能出现的例外情况。 任何未在函数内处理的异常SQLSTATE(使用处理程序),都会导致引发函数调用的SQL语句返回异常SQLSTATE。
- SQL函数定义中的行:
- 创建编译的SQL函数时,信息会保留在CREATE语句的行中。 线条由新的线条控制字符决定。
在编译后的 SQL 标量函数中, 换行控制字符是一个特殊字符,用于换行。 编译后的SQL标量函数的新行控制字符包括:
- 换行符
- 新行
- 回车
- 回车,换行
- 回车,换行
- SQL处理器程序的注意事项:
- SQL处理器程序(如SPUFI、 Db2 command line processor 和 DSNTEP2 )可能无法正确解析以分号结尾的常规主体中的SQL语句。 这些处理器程序接受多个SQL语句作为输入,每个语句用终止符分隔。 使用分号作为SQL语句终止符的处理器程序可能会截断带有嵌入分号的CREATE FUNCTION语句,并仅将其中一部分传递给 Db2。 因此,您可能需要为这些处理器程序更改 SQL 终止符。 有关更改SPUFI和 DSNTEP2 的终止符的信息,请参阅在SPUFI输入数据集中设置SQL终止符。
- 套餐注意事项:
- 为编译的SQL标量函数生成一个包。 与函数第一个版本相关的包的命名如下:
- 位置设置为当前服务器特殊寄存器的值。
- 包的集合标识 (schema)与函数的模式限定符相同。
- package-id 与函数的特定名称相同。
- version-id 与函数的初始版本的版本标识符相同。
使用与隐式或显式指定的函数选项相对应的绑定选项生成包。 除了相应的绑定选项外,该程序包还使用了以下绑定选项:
- FLAG(I)
- sqlerror(nopackage)
- 启用(*)
- 功能选项与绑定命令选项的对应关系:
- 下表列出了CREATE FUNCTION和ALTER FUNCTION的选项以及相应的绑定命令选项。 请参阅软件包、计划和服务中的绑定和重新绑定选项 ,了解绑定命令选项的相关信息。
表 1. 功能选项与绑定选项的对应关系 创建函数或修改函数选项 绑定命令选项 加速度 nnnn.m
accelerationwaitfordata( nnnn.m )
加速器加速器名称
加速器(加速器名称)
应用编码方案 ASCII 编码(ASCII) 应用编码方案 EBCDIC ENCODING(EBCDIC) 应用程序编码方案 UNICODE 编码(统一码) 档案 敏感 不 档案敏感(否) 档案 敏感 是 档案敏感(是) 业务时间敏感 不 对时间敏感(否) 业务时间敏感 是 对时间敏感(是) 当前数据 无 当前数据(否) 当前数据 是 当前数据(是) 动态规则运行 动态规则(运行) 动态规则绑定 DYNAMICRULES(BIND) 动态规则 定义绑定 动态规则(定义绑定) 动态规则 定义 运行 动态规则(定义运行) 动态规则 调用绑定 动态规则(调用绑定) 动态规则调用运行 动态规则(调用运行) get_accel_archive 没有
getaccelarchive(no)
获取加速档案 是 获取加速档案(是) 隔离等级 CS 绝缘(CS) 隔离等级 RS 隔离(RS) 隔离等级 RR 隔离(RR) 隔离等级 UR 隔离(UR) OPTHINT 字符串常量 OPTHINT (提示-ID ) 包裹所有者授权-姓名 所有者 (授权ID ) 限定符 schema-name 限定词 (限定词名称 ) 查询加速度 无
查询加速(无)查询 加速 启用 查询加速(启用) 查询加速启用,带故障恢复功能 查询加速(启用回退功能) 查询 加速 合格 查询加速(符合条件的) 查询 加速 全部 查询加速(全部) 永远重启 REOPT(ALWAYS) 重新选择 无 REOPT(NONE) 重新选择一次 REOPT(ONCE) 四舍五入 DEC_ROUND_CEILING 四舍五入(上限) 四舍五入 DEC_ROUND_DOWN 四舍五入 四舍五入 DEC_ROUND_FLOOR 四舍五入(取整) 四舍五入 DEC_ROUND_HALF_DOWN 舍入(向下取整) 四舍五入 DEC_ROUND_HALF_EVEN 四舍五入(HALFEVEN) 四舍五入 DEC_ROUND_HALF_UP 四舍五入(半) 四舍五入 DEC_ROUND_UP 四舍五入 SQL PATH 路径说明 路径 (路径说明 ) 系统时间敏感 不 系统敏感(否) 系统时间敏感 是 系统灵敏度(是) 确认绑定 确认(绑定) 验证运行 确认(运行) 附带解释 解释(是) 无需解释 解释(否) 立即写 立即执行(是) 无需立即撰写 即时写入(否) - 功能对象的应用兼容性级别考虑
- 应用程序兼容性级别控制着新功能和增强功能的采用和使用。 当一个对象被创建或修改时,会使用两个单独的应用程序兼容级别:一个用于处理对象的定义,另一个用于处理对象正文中的SQL语句:
对象定义 当前应用程序兼容性特殊寄存器值用于处理对象定义,但对象主体中的语句除外
此应用程序兼容性级别存储在 SYSENVIRONMENT.APPLCOMPAT 列中。 您可以在对象的目录定义中使用环境ID值来定位具有匹配ENVID值的SYSENVIRONMENT行。
当对象被重新生成时,应用程序兼容性级别可以更改。
物体主体中的陈述 CREATE或ALTER语句的APPLCOMPAT选项隐式或显式指定的应用程序兼容性级别用于处理对象主体中的语句。
此应用程序兼容性级别存储在与对象定义关联的软件包的 SYSPACKAGE.APPLCOMPAT 列中。
- 部署已编译的SQL标量函数:
- 当发出BIND DEPLOY命令将编译后的SQL标量函数部署到目标位置时,SECURED和NOT SECURED选项将包含在部署过程中。
当部署已编译的SQL标量函数时,如果目标位置不存在具有相同目标名称的函数,则部署的函数将在目标位置作为新函数创建,并具有在部署源中指定的相同SECURED或NOT SECURED选项(或使用NOT SECURED的默认值)。
当部署已编译的SQL标量函数时,如果目标位置已经存在具有相同目标名称的函数,则部署的函数要么作为函数的新版本添加,要么用于替换函数现有版本。 已部署功能的“安全”或“不安全”选项必须与目标位置现有功能的选项相同。
- 一个功能的版本:
- SQL函数的CREATE FUNCTION语句定义了函数的初始版本。 您可以使用ALTER FUNCTION语句的ADD VERSION子句定义其他版本。 一个函数的各个版本具有相同的函数签名和特定的名称。 然而,不同版本的功能参数名称可能有所不同。 只有一种版本的功能可以被视为该功能的有效版本。
- 其他语法和同义词:
- 为了与 Db2 或 Db2 系列中其他产品的早期版本兼容, Db2 支持以下替代语法:
- VARIANT作为“非确定性”的同义词
- NOT VARIANT 并非“确定性”的同义词
- NOT NULL CALL作为RETURNS NULL ON NULL INPUT的同义词
- NULL CALL作为CALLED ON NULL INPUT的同义词
- TIMEZONE可以作为TIME ZONE的替代选项。
CREATE FUNCTION示例(已编译的SQL标量)
CREATE FUNCTION REVERSE(INSTR VARCHAR(4000))
RETURNS VARCHAR(4000)
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN
DECLARE REVSTR, RESTSTR VARCHAR(4000) DEFAULT '';
DECLARE LEN INT;
IF INSTR IS NULL THEN
RETURN NULL;
END IF;
SET (RESTSTR, LEN) = (INSTR, LENGTH(INSTR));
WHILE LEN > 0 DO
SET (REVSTR, RESTSTR, LEN)
= (SUBSTR(RESTSTR, 1, 1) CONCAT REVSTR,
SUBSTR(RESTSTR, 2, LEN - 1),
LEN - 1);
END WHILE;
RETURN REVSTR;
END#