CREATE FUNCTION 语句(源函数)
CREATE FUNCTION 语句用于注册用户定义的函数,该函数基于数据库服务器中现有的标量或聚合函数。
调用CREATE FUNCTION(已获取)
此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL。
CREATE FUNCTION授权(来源)
以下定义的特权必须至少包含以下一项:
- 模式中的CREATEIN特权
- SYSADM 或 SYSCTRL 权限
- 系统 DBADM
安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
与模式名称匹配的授权ID隐式拥有该模式的CREATEIN权限。
如果用于创建函数的授权ID具有安装SYSADM权限或安装SYSOPR权限,并且当前SQLID设置为SYSINSTL,则该函数被标识为系统定义的函数。
源函数需要附加权限,如果函数使用表作为参数或引用不同类型,则需要其他权限。 这些特权包括:
- SOURCE子句引用的函数的EXECUTE权限。
- SELECT权限,任何表都是函数的输入参数。
- 函数所引用的每个不同类型的USAGE特权。
权限设置:
如果语句嵌入到应用程序中,权限集就是计划或软件包所有者所拥有的权限。 如果所有者是一个角色,则隐式模式匹配不适用,该角色需要包含前面列出的条件之一。
如果语句动态生成,且未在指定了 ROLE AS OBJECT OWNER 子句的可信环境中运行,则权限集是指进程的 SQL 授权 ID 所拥有的权限集。 如果架构名称与进程的SQL授权ID不同,则必须满足以下条件之一:
- 特权集包括SYSADM或SYSCTRL权限。
- 该进程的SQL授权ID对模式具有CREATEIN权限。
CREATE FUNCTION的语法(来源)
参数声明:
参数类型:
数据类型:
内置类型:
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
- 输入参数的数据类型是不同的类型。 参数的任何长度、精度、比例、子类型或编码方案属性都是不同类型的源类型的属性。
所有参数的隐式或显式编码方案 (字符或图形字符串数据类型 )必须相同——要么全部为ASCII,要么全部为EBCDIC,要么全部为UNICODE。
虽然字符数据类型的参数具有隐式或显式指定的子类型(BIT、SBCS或MIXED),但函数程序可以接收任何子类型的字符数据。 因此,在调用函数时,输入数据可能会转换为参数的子类型。
日期时间数据类型或不同类型的参数将以不同数据类型的形式传递给函数:
- 日期时间类型参数以字符数据类型传递,数据以ISO格式传递。
日期时间类型参数的编码方案与任何字符或图形字符串参数的隐式或显式编码方案相同。 如果没有传递字符串或图形字符串参数,则编码方案为安装面板 DSNTIPF 上的字段 DEF ENCODING SCHEME 的值。
- 一个不同的类型参数作为不同类型的源类型传递。
您可以指定任何内置数据类型或与源函数(在 SOURCE 子句中标识的函数)的相应参数的数据类型匹配或可以转换为该数据类型的不同类型。 (有关数据类型转换的信息,请参阅数据类型之间的转换。) 长度、精度或比例属性无需为具有这些属性的数据类型指定。 在指定具有这些属性的数据类型时,请遵循以下规则:
- 可以用一组空括号来表示长度、精度或比例与源函数相同。
- 如果未明确指定长度、精度或比例,且未指定空括号,则使用默认值。
- 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”的表参数的对应列。
有关使用表格定位器的更多信息,请参阅在用户定义的函数或存储过程中访问转换表。
- 退货
- 确定函数的输出。
- data-type2
- 指定输出的数据类型。 输出结果可以为空。
您可以指定任何内置数据类型或可从源函数结果的数据类型转换而来的不同类型。 (有关数据类型转换的信息,请参阅数据类型之间的转换。)
- AS LOCATOR
- 指定函数返回一个值定位符,而不是实际值。 仅当函数的输出为LOB数据类型或基于LOB数据类型的不同类型时,才能指定AS LOCATOR。
- 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)中,特定名称可用于唯一标识函数。 但是,不能通过其特定名称来调用该函数。
- PARAMETER CCSID
- 指示字符和图形字符串参数的编码方案是ASCII、EBCDIC还是UNICODE。 默认编码方案是指在参数列表的CCSID子句或RETURNS子句中指定的值,或在安装面板DSNTIPF的DEF ENCODING SCHEME字段中指定的值。
该条款为指定字符和图形字符串参数的编码方案提供了便利。 如果除了此 PARAMETER CCSID 子句之外,还为各个参数指定了各个 CCSID 子句, 则所有 CCSID 子句中指定的值必须与此子句中指定的值相同。
该条款还规定了系统生成的常规参数(如消息标记和DBINFO)所使用的编码方案。
- SOURCE
- 指定新函数被定义为源函数。 源函数由另一个函数 (源函数 )实现。 源函数必须是当前服务器上存在的标量或聚合函数,且必须属于以下函数类型之一:
- 用CREATE FUNCTION语句定义的函数
- CREATE TYPE语句为不同类型生成的转换函数
- 内置功能
如果源函数不是内置函数,则可以通过其名称、函数签名或特定名称来识别该函数。
如果源函数是内置函数,则 SOURCE 子句必须包含内置函数的函数签名。
源函数不能是任何内置函数(如果显示特定语法,则只能指定指定的形式):
- ARRAY_AGG
- ARRAY_DELETE
- ARRAY_FIRST
- ARRAY_LAST
- ARRAY_NEXT
- ARRAY_PRIOR
- CARDINALITY
- CHAR (datetime-expression, second-argument ) 其中 second-argument 是 ISO、USA、EUR、JIS 或 LOCAL,或者 CHAR 指定为 OCTETS、 CODEUNITS16 或 CODEUNITS32。
- CHARACTER_LENGTH
- 如果指定了CLOB if OCTETS、 CODEUNITS16 或 CODEUNITS32
- 如果参数是数组,则合并
- 计数(*)
- COUNT_BIG(*)
fl 504 cume_dist
FL 504 CUME_DIST(总计)
- 如果指定了DBCLOB、OCTETS、 CODEUNITS16 或 CODEUNITS32
- DECODE
- DECRYPT_BIT,第二个参数为DEFAULT
- DECRYPT_CHAR,第二个参数为DEFAULT
- DECRYPT_DB,第二个参数为DEFAULT
解密数据大整数
解密数据位
解密数据包
解密_datakey_dbclob
解密十进制数据
解密数据整数
解密_数据类型_varchar
解密_datakey_vargraphic
加密数据
- EXTRACT
fl 504 first_value
- GETVARIABLE,第二个参数为DEFAULT
FL 502 如果指定了 OCTETS、 CODEUNITS16 或 CODEUNITS32 ,或者第一个参数是数字,则为 GRAPHIC
- IFNULL 如果参数是数组
- 如果指定了 OCTETS、 CODEUNITS16 或 CODEUNITS32 ,则插入
FL 504 LAG
fl 504 last_value
FL 504 LEAD
- 如果指定了“左”字、“octets”、“ CODEUNITS16 ”或“ CODEUNITS32 ”,则
FL 501 LISTAGG
- LOCAL
- 如果指定了LOCATE if OCTETS、 CODEUNITS16 或 CODEUNITS32
- 最大
- MAX_CARDINALITY
- 最小值
fl 504 nth_value
FL 504 NTILE
- NULLIF
fl 504%_rank
FL 504 PERCENT_RANK(合计)
- 位置
fl 504 ratio_too_report
fl 504 regexp_count
fl 504 regexp_instr
fl 504 regexp_like
fl 504 regexp_replace
fl 504 regexp_substr
- RID
- 如果指定了 OCTETS、 CODEUNITS16 或 CODEUNITS32 ,则为正确
- STRIP,其中指定了多个参数
- SUBSTRING
- TRIM,第一个参数为BOTH、B、LEADING、L、TRAILING、T,或者第一个或第二个参数为FROM
- TRIM_ARRAY
- 如果指定了VARCHAR if OCTETS、 CODEUNITS16 或 CODEUNITS32
FL 502 如果指定了 OCTETS、 CODEUNITS16 或 CODEUNITS32 ,或者第一个参数是数字,则使用 VARGRAPHIC。
- XMLAGG
- XMLCONCAT
- XMLELEMENT
- XMLFOREST
- XMLNAMESPACES
如果源函数直接或间接基于外部标量函数,则源函数将继承外部标量函数的属性。 这可能涉及多个来源的功能。 例如,假设函数A源自函数B,而函数B又源自函数C。 函数C是一个外部标量函数。 函数A和B继承了函数C的CREATE FUNCTION语句外部子句中指定的所有属性。
- 功能名称
- 标识用作源函数的函数。 源函数可以定义任意数量的参数。 如果在指定或隐式模式中用指定名称定义了多个函数,则返回错误。
如果你指定了一个不合格的函数名 , Db2 搜索 SQL 路径的模式。 Db2 选择第一个只有用户具有执行权限的同名函数的方案。 如果函数不存在或模式中存在多个同名函数,则返回错误。
- 函数名(参数类型,……)
- 通过函数签名确定用作源函数的函数,该函数签名是函数的唯一标识符。 函数名称(参数类型......) 必须确定具有指定签名的函数。 指定的参数必须与创建函数时指定相应位置的数据类型相匹配。 Db2 使用数据类型的数量和数据类型的逻辑连接来识别特定的函数实例。 数据类型的同义词被视为匹配项。
如果函数是用表参数定义的(在CREATE FUNCTION语句中指定了 LIKE TABLE name AS LOCATOR子句 ,以指示输入参数之一是转换表),则函数签名不能用于唯一标识函数。 请使用其他语法变体之一来识别该函数,如果函数名称是唯一的,请使用函数名称,否则请使用特定名称。
如果指定了函数名() ,则所标识的函数必须不带参数。
- 功能名称
- 标识源函数的函数名称。 如果您指定了一个不完整的名称, Db2 将搜索 SQL路径的架构。 否则, Db2 将在指定的架构中搜索该功能。
- 参数类型 ,...
- 确定功能的参数。
如果指定了不合法的类型名称, Db2 将搜索SQL路径,以解析该类型名称的架构名称。
对于某些在此上下文中指定的数据类型,允许使用空括号。 对于具有长度、精度或比例属性的数据类型,请使用以下规范之一:
- 空括号表示 Db2 在判断数据类型是否匹配时忽略该属性。 例如,DEC()被视为与数据类型为DEC(7,2)的函数参数匹配。 但是,不能在空括号中指定 FLOAT,因为其参数值表示特定数据类型(REAL 或 DOUBLE)。
- 如果指定了长度、精度或比例属性的特定值,则该值必须与CREATE FUNCTION语句中(隐式或显式)指定的值完全匹配。 如果数据类型为浮点型,精度不必与指定的值完全匹配,因为匹配是基于数据类型(REAL或DOUBLE)的。
- 如果未明确指定长度、精度或比例,且未指定空括号,则默认使用数据类型的属性。 隐式长度必须与CREATE FUNCTION语句中(隐式或显式)指定的值完全匹配。
如果您省略了 FOR 子类型 DATA 子句或具有子类型或编码方案属性的数据类型的 CCSID 子句,则 Db2 在确定数据类型是否匹配时忽略该属性。 一个例外是忽略属性是FOR BIT DATA。 新函数的字符型 FOR BIT DATA 参数不能与源函数的未定义为字符型 FOR BIT DATA 的参数相对应。 同样,新函数中不为位数据的字符参数不能与源函数中定义为位数据的字符参数相对应。
正在创建的函数中的输入参数数量必须与源函数中的参数数量相同。 如果每个输入参数的数据类型与源函数的相应参数不同或不能转换为源函数的相应参数,则会发生错误。 源函数最终结果的数据类型必须与被调用函数的返回值匹配或可转换为被调用函数的返回值。
- AS LOCATOR
- 指定函数定义为接收此参数的定位器。 如果指定了 AS LOCATOR,则数据类型必须为 LOB 或基于 LOB 的不同类型。
- SPEC IFIC 特定名称
- 通过特定名称识别用作源函数的函数。
如果您指定了不加限制的特定名称 , Db2 将搜索SQL路径以找到架构。 Db2 选择第一个包含具有特定名称的函数且用户具有执行权限的模式。 Db2 如果在SQL路径中的某个模式中找不到具有特定名称的函数,则返回错误。
如果您指定了限定名称 , Db2 将在指定的模式中搜索该函数。 Db2 如果找不到特定名称的函数,则返回错误。
CREATE FUNCTION的注释(来源)
- 所有类型的用户自定义功能注意事项:
- 有关适用于所有类型用户定义函数的注意事项,请参阅 CREATE FUNCTION语句(概述 )。
- 功能所有者权限:
- 对于源函数,在以下情况下,所有者有权执行该函数(EXECUTE权限):
- 如果基础功能是用户自定义功能,且所有者通过授权选项获得了执行基础功能的权限,则新功能的权限将包含授权选项。 否则,所有者可以执行新功能,但不能授予他人执行该功能的权限。
- 如果底层功能是内置功能,则所有者有权使用授权选项来执行底层内置功能,并且新功能的权限包括授权选项。
更多信息,请参阅 GRANT语句(函数或过程权限 )。 有关对象所有权的更多信息,请参阅授权、特权、权限、掩码和对象所有权。
- 创建源函数的规则:
- 假设创建的函数名为NEWF,源函数名为SOURCEF。 创建源函数时,请考虑以下规则:
- 源函数和源函数的非限定名称可以不同(NEWF和SOURCEF)。
- NEWF和SOURCEF的输入参数数量必须相同。
- 在指定NEWF的输入参数和输出时,可以为具有这些属性的数据类型指定精度、比例、子类型或编码方案的值,也可以使用空括号。
空括号,如VARCHAR(),表示属性值与SOURCEF的相应参数的属性相同,或者由数据类型提升确定。 如果您为属性指定了任何值, Db2 将根据相应的输入参数和SOURCEF的返回输出(如下所述)检查这些值。
- 当执行CREATE FUNCTION语句时, Db2 会检查NEWF的输入参数是否与SOURCEF的输入参数一致。 NEWF函数的每个输入参数的数据类型必须与SOURCEF函数的相应参数的数据类型相同或可转换为该数据类型。 (有关数据类型转换的信息,请参阅数据类型之间的转换。)
此检查并不能保证在调用NEWF时不会发生错误。 例如,如果相应的 SOURCEF 参数长度较短或精度较低,则与 NEWF 参数的数据类型和长度或精度属性相匹配的参数可能无法提升。 通常,不要用长度或精度属性来定义源函数的参数,这些属性应小于源函数相应参数的属性。
- 当执行CREATE FUNCTION语句时, Db2 会检查NEWF的RETURNS子句中标识的数据类型与SOURCEF返回的数据类型是否匹配。 SOURCEF返回的数据类型必须与NEWF的RETURNS数据类型相同或可转换为该类型。
此检查并不能保证在调用NEWF时不会发生错误。 例如,如果 NEWF 的 RETURNS 数据类型长度较短或精度较低,则与 SOURCEF 结果的数据类型和长度或精度属性匹配的结果的价值可能无法提升。 考虑定义源函数的返回数据类型时,如果源函数的返回数据类型的长度或精度属性小于源函数返回的数据类型的属性,可能会产生什么影响。
- 安全功能:
- 用户自定义的源函数继承了源函数的SECURED或NOT SECURED属性,其中仅考虑最顶层的用户自定义函数。 如果最顶层的用户自定义函数是安全的,那么任何嵌套的用户自定义函数也被视为安全。 Db2 无法验证这些嵌套的用户定义函数是否安全。 如果这些嵌套函数可以访问敏感数据,安全管理员需要确保这些函数被允许访问敏感数据,并确保已针对这些函数的任何更改建立了变更控制审核程序。
如果源函数以 VERIFY_GROUP_FOR_USER 或 VERIFY_ ROLE_FOR_USER 函数作为其源,则源函数必须只指定两个输入参数。
CREATE FUNCTION示例(来源)
- 示例 1
- 假设您创建了一个独特的 HATSIZE 类型,该类型基于内置数据类型 INTEGER。 您希望有一个AVG函数来计算不同部门帽子的平均尺寸。 创建一个基于内置函数AVG的源函数。
CREATE FUNCTION AVE (HATSIZE) RETURNS HATSIZE SOURCE SYSIBM.AVG (INTEGER);当您创建了独特的 HATSIZE 类型时,系统会生成两个转换函数,允许将 HATSIZE 转换为 INTEGER 作为参数,并将 INTEGER 转换为 HATSIZE 作为函数结果。
- 示例 2
- 在史密斯在他的模式中注册了外部标量函数CENTER之后,您决定要使用这个函数,但您希望它接受两个整数参数,而不是一个整数参数和一个浮点参数。 创建一个基于CENTER的函数。
CREATE FUNCTION MYCENTER (INTEGER, INTEGER) RETURNS FLOAT SOURCE SMITH.CENTER (INTEGER, FLOAT);
