函数
函数 是一个由函数名表示的操作,后跟括在括号中的一个或多个操作数。
函数表示一组输入值与一组结果值之间的关系。 函数的输入值称为 自变量。 例如,可以向 TIMESTAMP 函数传递类型为 DATE 和 TIME 的自变量,结果为 TIMESTAMP。
有几种方法可以对函数进行分类。
- 内置函数 是随数据库管理器提供的函数。 内置函数包括聚集函数 (例如, AVG) ,运算符函数 (例如, +) ,强制类型转换函数 (例如, DECIMAL) ,标量函数 (例如,天花板) 和表函数 (例如, BASE_TABLE)。 内置函数通常在以 "SYS" 开头的模式 (例如, SYSIBM , SYSFUN 和 SYSIBMADM) 中定义,而某些函数也在以 "DB2" 开头的模式 (例如, DB2MQ) 中定义。
- 用户定义的函数 是使用 SQL 数据定义语句创建并向目录中的数据库管理器注册的函数。 用户定义的模式函数 are created using the CREATE FUNCTION statement.用户定义的模块函数 are created using the ALTER MODULE ADD FUNCTION or ALTER MODULE PUBLISH FUNCTION statements. 在名为 SYSIBMADM 的模式中的一组模块中,随数据库管理器提供了一组 用户定义的模块函数 。 用户定义的函数 位于创建该函数的模式中,或者位于添加或发布该函数的模块中。
用户定义的函数通过添加可在数据库引擎本身中应用的函数定义 (由用户或第三方供应商提供) 来扩展数据库系统的功能。 扩展数据库函数使数据库能够利用应用程序所使用的引擎中的相同函数,从而在应用程序与数据库之间提供更多协同作用。
- 外部函数 是使用对对象代码库的引用以及该库中将在调用该函数时执行的函数来定义到数据库的。 外部函数不能是聚集函数。
- 仅使用 SQL 语句 (包括至少一个 RETURN 语句) 向数据库定义 SQL 函数 。 它可以返回标量值,行或表。 SQL 函数不能是聚集函数。
- 有源函数 是使用对数据库已知的另一个内置函数或用户定义函数的引用来定义数据库的。 有源函数可以是标量函数或聚集函数。 它们对于支持具有用户定义类型的现有函数很有用。
- 接口函数 是通过引用数据库已知的几个用户定义的例程来对数据库定义的。 接口函数只能是聚集函数。
另一种分类函数的方法是作为标量, 聚集,行或表函数,具体取决于输入数据值和结果值。 标量函数 是每次调用时返回单值答案的函数。 例如,内置函数 SUBSTR () 是标量函数。 标量 UDF 可以是外部的,也可以是源的。
聚集函数 是从概念上向其传递一组相似值 (列) 并返回单值答案的函数。 聚集函数的一个示例是内置函数 AVG ()。 可以定义源自其中一个内置聚集函数的列 UDF。 这对于单值类型很有用。 例如,如果存在使用基本类型 INTEGER 定义的单值类型 SHOESIZE ,那么可以定义源自内置函数 AVG (INTEGER) 的 UDF AVG (SHOESIZE) ,并且它将是聚集函数。 可以定义基于多个用户定义的例程的聚集接口函数。
行函数 是返回一行值的函数。 它可以在支持行表达式的上下文中使用。 它还可以 用作变换函数,将结构化类型的属性值映射到行中的值。 必须将行函数定义为 SQL 函数。
表函数 是将表返回到引用该表的 SQL 语句的函数。 它只能在 SELECT 语句的 FROM 子句中引用。 此类函数可用于将 SQL 语言处理能力应用于不在数据库中的数据,或将此类数据转换为数据库中的表。 表函数可以读取文件,从 Web 获取数据或访问 Lotus Notes® 数据库并返回结果表。 此信息可与数据库中的其他表连接。 可以将表函数定义为外部函数或 SQL 函数。 (表函数不能是有源函数。)
函数特征符
模式函数由其模式名称,函数名,参数数目及其参数的数据类型标识。 模块函数由其模式名称,模块名称,函数名称,参数数目及其参数的数据类型标识。 此 模式函数或模块函数的标识 称为 函数特征符,在数据库中必须唯一; 例如, TEST.RISK(整数)。 在模式或模块中可以有多个具有相同名称的函数,前提是参数的数目或参数的数据类型不同。 具有多个 具有相同数目的参数 的函数实例的函数名称为 重载 函数。 可以在模式中重载函数名,在这种情况下,该模式中有多个名称为 且参数数目相同的函数 的函数。 类似地,函数名可能会在模块中重载,在这种情况下,该模块中有多个具有相同数目参数的函数。 这些函数必须具有不同的参数数据类型。 函数也可以重载 跨模式 SQL 路径,在这种情况下,存在多个具有该名称的函数 在 SQL 路径的不同模式中具有相同数目的参数。 这些函数不一定具有不同的参数数据类型。
函数调用
对函数的每个引用都符合以下语法:
- 1 The ALL or DISTINCT keyword can be specified for certain built-in aggregate functions or a user-defined function that is sourced on certain built-in aggregate functions. The ALL keyword can be specified for an aggregate interface function.
在先前显示的语法中, expression 和 row-expression 不能包含聚集函数。 有关 表达式的其他规则,请参阅 表达式
。
- 模式名称
- 未限定的模块名称
- 模式限定的模块名称
- 如果使用模式限定的模块名称作为限定符,那么作用域为指定的模块。
- 如果使用单个标识作为限定符,那么作用域包括:
- 与限定符匹配的模式
- 下列其中一个模块:
- 调用模块 (如果调用模块名称与限定符匹配)
- SQL 路径中与限定符匹配的模式中的第一个模块
- 如果未使用限定符,那么作用域将包含 SQL 路径中的模式,如果从模块对象中调用函数,那么将包含从中调用函数的同一模块。
调用任何函数时,数据库管理器必须确定要执行的函数。 此过程称为 函数解析 ,适用于内置函数和用户定义的函数。 建议将打算调用用户定义的函数的函数调用完全限定。 这将提高函数解析的性能,并防止在添加新功能或授予特权时产生意外的函数解析结果。
自变量 是在调用或指定 DEFAULT 时传递给函数的值。 在 SQL 中调用函数时,将向其传递零个或多个自变量的列表。 它们是位置性的,因为自变量的语义由其在自变量列表中的位置确定。 参数 是函数输入或函数输出的正式定义。 当向数据库定义函数时,要么在内部 (内置函数) ,要么由用户 (用户定义的函数) ,指定其参数 (零个或更多个) ,它们的定义顺序定义了它们的位置和语义。 因此,每个参数都是函数或函数输出的特定位置输入。 调用时,会使用位置语法或指定的语法将自变量分配给参数。 如果使用位置语法,那么自变量根据其在自变量列表中的位置与特定参数相对应。 如果使用指定的语法,那么参数名称对应于特定参数。 当使用指定的语法将自变量指定给参数时,还必须使用指定的语法 (SQLSTATE 4274K) 来指定该自变量后面的所有自变量。 指定参数的名称在函数调用中只能出现一次 (SQLSTATE 4274K)。 如果函数调用的自变量的数据类型与所选函数的参数的数据类型不匹配,那么在执行时,将使用与列赋值相同的规则将自变量转换为参数的数据类型。 这包括参数与参数之间的精度,小数位或长度不同的情况。 在函数调用的自变量为 DEFAULT 规范的情况下,用于自变量的实际值是指定为函数定义中相应参数的缺省值的值。 如果没有为参数定义缺省值,那么将使用空值。 如果使用非类型表达式 (参数标记, NULL 关键字或 DEFAULT 关键字) 作为自变量,那么与自变量关联的数据类型由所选函数的参数的参数数据类型确定。
通过对模式函数的 EXECUTE 特权来控制对模式函数的访问。 如果调用函数的语句的授权标识不具有 EXECUTE 特权,那么函数解析算法将不会考虑模式函数,即使它是更好的匹配。 SYSIBM 和 SYSFUN 模式中的内置函数具有隐式授予 PUBLIC 的 EXECUTE 特权。
通过对模块中所有函数的模块的 EXECUTE 特权来控制对模块函数的访问。 调用函数的语句的授权标识可能没有对模块的 EXECUTE 特权。 在这种情况下,该模块中的模块函数 (与模式函数不同) 仍被函数解析算法考虑,即使它们无法执行也是如此。
调用用户定义的函数时,将使用存储赋值将其每个自变量的值赋给该函数的相应参数。 根据主语言的调用约定将控制传递到外部函数。 当用户定义的标量函数或用户定义的聚集函数的执行完成时,将使用存储分配将该函数的结果分配给结果数据类型。 有关分配规则的详细信息,请参阅 分配和比较
。
只能在子查询的 FROM 子句中引用表函数。 有关引用表函数的更多信息,请参阅 table-reference。
函数解析 (function resolution)
调用函数后,数据库管理器必须确定要执行的函数。 此过程称为函数解析,适用于内置函数和用户定义函数。
- 所调用函数的名称的限定
- 调用函数的上下文
- 调用的函数的非限定名
- 指定的自变量数
- 指定的任何参数名称
- 模式函数的授权。
然后,数据库管理器根据所调用函数的自变量的数据类型与候选函数集中函数的参数的数据类型进行比较,从候选函数集合中确定最佳拟合。 还会考虑 SQL 路径和参数数目。 请参阅 确定最佳拟合度 以获取详细信息。
- 如果选择了模块函数,并且从模块外部调用了该函数,或者从模块对象中调用了该函数,并且限定符与上下文模块名称不匹配,那么调用该函数的语句的授权标识必须对包含所选函数的模块具有 EXECUTE 特权 (SQLSTATE 42501)。
- 如果选择了某个函数,那么其成功使用取决于在允许返回结果的上下文中调用该函数。 例如,如果函数返回不允许表的表,那么将返回错误 (SQLSTATE 42887)。
- 如果选择了强制类型转换函数 (内置函数或用户定义函数) ,并且需要将任何自变量隐式强制类型转换 (未提升) 到参数的数据类型,那么将返回错误 (SQLSTATE 42884)。
- 如果函数调用涉及具有未命名行类型的自变量,那么如果发生以下任一情况,将返回错误 (SQLSTATE 42884):
- 参数的字段数与参数的字段数不匹配。
- 参数字段的数据类型不可分配给参数字段的相应数据类型。
确定候选函数集
- 让 A 是函数调用中的自变量数。
- 让 P 是函数特征符中的参数数目。
- 让 N 是未定义缺省值的函数特征符中的参数数。
- 每个候选函数都具有匹配的名称和适用的参数数。 适用的参数数量满足条件 N ≤ A ≤ P。
- 每个候选函数都有参数,因此对于函数调用中的每个指定参数,都存在一个具有匹配名称的参数,该参数尚未对应于位置 (未命名) 参数。
- 在函数调用中没有相应参数 (由位置或名称指定) 的候选函数的每个参数都是使用缺省值定义的。
- 一组一个或多个模式中的每个候选函数都具有与调用该函数的语句的授权标识相关联的 EXECUTE 特权。
- 来自除上下文模块以外的模块的每个候选函数都是已发布的模块函数。
- 上下文模块,即包含调用函数的模块对象的模块
- 一组一个或多个模式
- 除上下文模块以外的模块
- 限定函数调用: 当使用函数名和限定符调用函数时,数据库管理器使用限定符以及在某些情况下使用所调用函数的上下文来确定候选函数集。
- 如果使用带有限定符的函数名从模块对象中调用函数,那么数据库管理器将考虑该限定符是否与上下文模块名称匹配。 如果限定符是单个标识,那么在确定匹配时将忽略模块的模式名称。 如果限定符是两部分标识,那么在确定匹配时,会将其与模式限定模块名称进行比较。 如果限定符与上下文模块名称匹配,那么数据库管理器将在上下文模块中搜索候选函数。
如果在上下文模块中找到一个或多个候选函数,那么将处理这组候选函数以实现最佳拟合,而不考虑任何其他搜索空间中的可能候选函数 (请参阅
确定最佳拟合
)。 否则,请继续执行下一个搜索空间。 - 如果限定符是单个标识,那么数据库管理器会将限定符视为模式名称,并在该模式中搜索候选函数。
如果在模式中找到一个或多个候选函数,那么将处理此候选函数集以实现最佳拟合,而不考虑任何其他搜索空间中的可能候选函数 (请参阅
确定最佳拟合
)。 否则,请继续执行下一个搜索空间 (如果适用)。 - 如果从模块外部调用该函数,或者从模块对象中调用该函数时限定符与上下文模块名称不匹配,那么数据库管理器会将该限定符视为模块名称。 在不考虑对模块的 EXECUTE 特权的情况下,数据库管理器然后根据以下条件选择第一个匹配的模块:
- 如果模块名称是使用模式名称限定的,请选择具有该模式名称和模块名称的模块。
- 如果模块名称未使用模式名称进行限定,请选择在 SQL 路径中最早在模式中找到的具有该模块名称的模块。
- 如果使用 SQL 路径找不到模块,请选择具有该模块名称的模块公用别名。
如果在所选模块中找到一个或多个候选函数,那么将处理此候选函数集以实现最佳拟合 (请参阅
确定最佳拟合
)。
- 如果使用带有限定符的函数名从模块对象中调用函数,那么数据库管理器将考虑该限定符是否与上下文模块名称匹配。 如果限定符是单个标识,那么在确定匹配时将忽略模块的模式名称。 如果限定符是两部分标识,那么在确定匹配时,会将其与模式限定模块名称进行比较。 如果限定符与上下文模块名称匹配,那么数据库管理器将在上下文模块中搜索候选函数。
- 未限定的函数调用: 在没有限定符的情况下调用函数时,数据库管理器将考虑所调用函数的上下文以确定候选函数集。
- 如果从模块对象中使用未限定的函数名调用函数,那么数据库管理器将在上下文模块中搜索候选函数。
如果在上下文模块中找到一个或多个候选函数,那么这些候选函数将包含在 SQL 路径中的模式中的任何候选函数中 (请参阅下一项)。
- 如果使用未限定的函数名 (从模块对象中或从模块外部) 调用函数,那么数据库管理器将搜索 SQL 路径中的模式列表以解析要执行的函数实例。 对于 SQL 路径中的每个模式 (请参阅
SQL 路径
) ,数据库管理器将在该模式中搜索候选函数。如果在 SQL 路径中的模式中找到一个或多个候选函数,那么这些候选函数将包含在上下文模块中的任何候选函数中 (请参阅前一项)。 将处理此候选函数集以实现最佳拟合 (请参阅
确定最佳拟合
)。
- 如果从模块对象中使用未限定的函数名调用函数,那么数据库管理器将在上下文模块中搜索候选函数。
如果数据库管理器找不到任何候选函数,那么将返回错误 (SQLSTATE 42884)。
确定最佳拟合度
候选函数集可能包含一个函数或多个具有相同名称的函数。 在任一情况下,参数的数据类型,模式在 SQL 路径中的位置以及候选函数集中每个函数的参数总数都用于确定该函数是否满足最佳拟合要求。
如果候选函数集包含多个函数,并且在函数调用中使用了命名自变量,那么对于所有候选函数,与命名自变量对应的参数的顺序位置必须相同 (SQLSTATE 4274K)。
术语 参数集 用于引用参数列表中同一位置的所有参数 (其中存在此类参数) 的候选函数集。 根据在函数调用中指定参数的方式来确定参数的相应参数。 对于位置自变量,参数的相应自变量是函数调用中与候选函数的参数列表中的参数位置相同的位置中的自变量。 对于指定的自变量,参数的相应自变量是与参数同名的自变量。 在这种情况下,在确定最佳拟合时,不会考虑函数调用中自变量的顺序。 如果候选函数中的参数数量大于函数调用中的参数数量,那么将处理没有相应参数的每个参数,就像它具有以 DEFAULT 关键字作为值的相应参数一样。
- Step 1: Considering arguments that are typed expressions
- 数据库管理器通过将每个参数的数据类型与相应参数的数据类型进行比较,确定满足调用最佳拟合要求的函数或函数集。确定参数的数据类型是否与其相应参数的数据类型相同时:
- 数据类型的同义词匹配。 例如, FLOAT 和 DOUBLE 被视为相同。
- 将忽略数据类型的属性,例如长度,精度,小数位和代码页。 因此, CHAR (8) 和 CHAR (35) 被视为与 DECIMAL (11, $TAG2) 和 DECIMAL (4, 3) 相同。
通过仅考虑那些不是非类型表达式的函数调用的每个自变量的数据类型与函数实例的相应参数的数据类型匹配或可提升的函数来获取候选函数的子集。 如果函数调用的自变量是无类型表达式,那么相应参数的数据类型可以是任何数据类型。 数据类型提升 中数据类型提升的优先顺序列表以最佳到最差的顺序显示适合 (考虑提升) 每种数据类型的数据类型。 如果此子集不为空,那么将使用此候选函数子集上的 可提升流程 来确定最佳拟合度。 如果此子集为空,那么将使用原始候选函数集上的 可级联过程 来确定最佳拟合度。- 可提升过程
- 此过程仅在考虑函数调用中的自变量是匹配还是可以提升到函数定义的相应参数的数据类型时确定最佳拟合度。 对于候选函数的子集,从左到右处理参数列表,在移动到第二位置的参数集合之前,从候选函数的子集处理第一位置的参数集合,依此类推。 以下步骤用于从候选函数子集中除去候选函数 (仅考虑提升):
- 如果一个候选函数有一个参数,其中相应自变量的数据类型与参数的数据类型拟合 (仅考虑提升) 优于其他候选函数的数据类型,那么将消除那些与函数调用不匹配的候选函数。 数据类型提升 中数据类型提升的优先顺序列表以最佳到最差的顺序显示适合 (考虑提升) 每种数据类型的数据类型。
- 如果相应自变量的数据类型是无类型表达式,那么不会消除任何候选函数。
- 对于其余候选函数中的下一组参数,将重复这些步骤,直到没有更多参数集为止。
- 可强制转型的流程
- 对于每个参数,如果函数调用中相应参数的数据类型匹配,或者可以提升到函数定义的参数的数据类型,那么此过程首先确定最佳拟合度。 然后,对于没有相应参数的每个参数集都具有可提升的数据类型,如果可以隐式地将相应参数的数据类型强制转换为该参数的数据类型,那么对于每个参数,数据库管理器将考虑该参数的数据类型。对于候选函数集合,从左到右处理参数列表中的参数,在移动到第二位置中的参数集合之前,从所有候选函数处理第一位置中的参数集合,以此类推。 以下步骤用于从候选函数集中除去候选函数 (仅考虑提升):
- 如果一个候选函数有一个参数,其中相应自变量的数据类型与参数的数据类型拟合 (仅考虑提升) 优于其他候选函数的数据类型,那么将消除那些与函数调用不匹配的候选函数。 数据类型提升 中数据类型提升的优先顺序列表以最佳到最差的顺序显示适合 (考虑提升) 每种数据类型的数据类型。
- 如果对应自变量的数据类型不可与任何候选函数的参数的数据类型提升 (包括当对应自变量为非类型表达式时的情况) ,那么不会消除任何候选函数。
- 对于其余候选函数中的下一组参数,将重复这些步骤,直到没有更多参数集为止。
如果至少一组参数没有适合的相应参数 (仅考虑提升) ,并且该参数集的相应参数具有数据类型,那么数据库管理器会将每个此类参数集从左到右进行比较。 以下步骤用于从候选函数集合中消除候选函数 (考虑隐式强制类型转换)。- 如果所有其余候选函数的参数集的所有数据类型都不属于同一数据类型优先顺序列表 (如 数据类型提升中所指定) ,那么将返回错误 (SQLSTATE 428F5)。
- 如果无法将相应参数的数据类型隐式强制类型转换为参数的数据类型 (如用于函数解析的隐式强制类型转换中所指定) ,那么将返回错误 (SQLSTATE 42884)。
- 如果一个候选函数有一个参数,其中相应参数的数据类型拟合 (考虑隐式强制类型转换) 参数的数据类型优于其他候选函数,那么将消除那些与函数调用不匹配的候选函数。 用于函数解析的隐式强制类型转换 中的数据类型列表显示了更适合 (考虑隐式强制类型转换) 的数据类型。
- 对于下一组参数重复这些步骤,这些参数没有适合的相应参数 (仅考虑提升) ,并且该参数集的相应参数具有数据类型,直到没有更多此类参数集或发生错误为止。
- Step 2: Considering SQL path
- 如果保留了多个候选函数,并且存在仍包含候选函数的上下文模块,那么数据库管理器将选择这些函数。 如果上下文模块中没有上下文模块或没有候选函数,那么数据库管理器将选择其模式在 SQL 路径中最早的那些候选函数。
- Step 3: Considering number of arguments in the function invocation
- 如果存在多个候选函数,并且如果一个候选函数的参数数量小于或等于其他候选函数的参数数量,那么将消除那些参数数量较多的候选函数。
- Step 4: Considering arguments that are untyped expressions
- 如果保留了多个候选函数,并且至少一组参数具有作为非类型表达式的相应自变量,那么数据库管理器将从左到右对每个此类参数集进行比较。 以下步骤用于从候选函数集合中消除候选函数:
- 如果所有其余候选函数的参数集的所有数据类型都不属于同一数据类型优先顺序列表 (如 数据类型提升中所指定) ,那么将返回错误 (SQLSTATE 428F5)。
- 如果与其他候选函数相比,一个候选函数的参数的数据类型进一步保留在隐式强制类型转换的数据类型排序中,那么将消除数据类型排序中参数的数据类型更靠右的那些候选函数。 "隐式强制类型转换用于函数解析" 中的数据类型列表显示隐式强制类型转换的数据类型排序。
- 函数解析的隐式强制类型转换
- 对于具有用户定义类型,引用类型或 XML 数据类型的自变量,不支持函数解析的隐式强制类型转换。 内置或用户定义的强制类型转换函数也不支持此功能。 支持以下情况:
- 可以将一个数据类型的值强制转换为同一数据类型优先顺序列表中的任何其他数据类型,如 数据类型提升中所指定。
- 可以将数字或日期时间数据类型强制转换为:
- 在 Unicode 数据库中,是指非 CLOB 的字符数据类型或非 DBCLOB 的图形数据类型。
- 在非 Unicode 数据库中,是指非 CLOB 的字符数据类型。
- 可以将 CLOB 以外的字符数据类型强制转换为数字或日期时间数据类型。
- 在 Unicode 数据库中,除 DBCLOB 以外的图形数据类型可以强制转换为数字或日期时间数据类型。
- 可以将字符 FOR BIT DATA 强制转换为二进制字符串数据类型。
- 可以将二进制字符串数据类型强制转换为字符 FOR BIT DATA。
- 可以将 TIMESTAMP 数据类型强制转换为 TIME 数据类型。
- BOOLEAN 数据类型可以强制转换为二进制整数数据类型,字符数据类型 (非 CLOB) 或图形数据类型 (非 DBCLOB)。
- 可以将二进制整数数据类型,字符数据类型 (非 CLOB) 或图形数据类型 (非 DBCLOB) 强制转换为 BOOLEAN。
- 可以将非类型化自变量强制类型转换为任何数据类型。
与促销的数据类型优先顺序列表类似,对于隐式强制类型转换,存在对相关数据类型组中的数据类型的顺序。 执行考虑隐式强制类型转换的函数解析时,将使用此顺序。 表 1 显示了用于函数解析的隐式强制类型转换的数据类型排序。 数据类型以最佳到最差顺序列出 (请注意,这与用于提升的数据类型优先顺序列表中的顺序不同)。 在 Unicode 数据库中,当函数解析从 SYSIBM 模式中选择内置函数时,如果内置函数同时支持参数的字符输入和图形输入,那么自变量将隐式强制转换为字符。
表 1. 函数解析的隐式强制类型转换的数据类型排序 数据类型组 用于函数解析的隐式强制类型转换的数据类型列表 (按最佳到最差顺序) 数字数据类型 DECFLOAT , double , real , decimal , BIGINT , INTEGER 和 SMALLINT 字符和图形字符串数据类型 VARCHAR 或 VARGRAPHIC , CHAR 或 GRAPHIC , CLOB 或 DBCLOB 二进制字符串数据类型 VARBINARY , BINARY 和 BLOB 日期时间数据类型 TIMESTAMP 和 DATE 注:- 上表中的小写类型定义如下:
- decimal = DECIMAL (P,S) or NUMERIC(P,S)
- real = REAL 或 FLOAT (n) ,其中 n 不大于 24
- double = DOUBLE , DOUBLE-PRECISION , FLOAT 或 FLOAT (n) ,其中 n 大于 24
- 仅对于 Unicode 数据库,以下内容被视为等效数据类型:
- CHAR 或 GRAPHIC
- VARCHAR 和 VARGRAPHIC
- CLOB 和 DBCLOB
表 2. 在需要隐式强制类型转换的情况下从 SYSIBM 模式调用内置标量函数时自变量的派生长度 源数据类型 目标类型和长度 CHARGRAPHICVARCHARVARGRAPHICCLOBDBCLOBBINARYVARBINARYBLOBTIMESTAMPDECFLOAT布尔值untyped 127 127 254 254 32767 32767 - - 32767 12 34 5 SMALLINT 6 6 6 6 - - - - - - - 5 INTEGER 11 11 11 11 - - - - - - - 5 BIGINT 20 20 20 20 - - - - - - - 5 DECIMAL (p,s) 2 +p 2 +p 2 +p 2 +p - - - - - - - - REAL 24 24 24 24 - - - - - - - - 双 24 24 24 24 - - - - - - - - DECFLOAT 42 42 42 42 - - - - - - - - CHAR (n) - - - - - - n n n 12 34 - VAR CHAR (n) 最小值 (n, 254) 最小值 (n, 127) - - - - 最小值 (n, 254) n n 12 34 - CLOB (n) 最小值 (n, 254) 最小值 (n, 127) 最小值 (n, 32672) 最小值 (n, 16336) - - - - - - - - GRAPHIC (n) - - - - - - - - - 12 34 - VARGRAPHIC (n) 最小值 (n, 254) 最小值 (n, 127) - - - - - - - 12 34 - DBCLOB (n) 最小值 (n, 254) 最小值 (n, 127) 最小值 (n, 32672) 最小值 (n, 16336) - - - - - - - - BINARY (n) n - n - - - - - - - - - VARBINARY (n) 最小值 (n, 254) - n - - - 最小值 (n, 254) - - - - - BLOB (n) 最小值 (n, 254) - 最小值 (n, 32672) - - - 最小值 (n, 254) 最小值 (n, 32672) - - - - 时间 8 8 8 8 - - - - - - - - 日期 10 10 10 10 - - - - - - - - TIMESTAMP (p) 如果 p=0 ,那么 19 else p+20 如果 p=0 ,那么 19 else p+20 如果 p=0 ,那么 19 else p+20 如果 p=0 ,那么 19 else p+20 - - - - - - - - 布尔值 5 5 5 5 - - - - - - - - 注
此表显示与 Unicode 数据库环境关联的字符串单元中的字符串和图形字符串数据类型,其中字符串单元缺省值为 SYSTEM。 如果 Unicode 数据库环境将字符串单元设置为 CODEUNITS32,那么表示数据类型最大长度的任何字符串或图形字符串长度属性都应视为表示 CODEUNITS32中的数据类型最大长度。 所有字符串或图形字符串数据类型都具有数据库环境的缺省字符串单元。
内置函数的 SQL 路径注意事项
函数解析适用于所有函数,包括内置或用户定义的模式函数和模块函数。 如果在不使用其模式名称的情况下调用函数,那么将使用 SQL 路径将函数调用解析为特定函数。
在函数解析期间始终会考虑 SYSIBM 模式中的内置函数,即使 SYSIBM 未显式包含在 SQL 路径中也是如此。 从路径中省略 SYSIBM 会导致假定 (对于函数和数据类型解析) SYSIBM 是路径上的第一个模式。
"SHAREFUN","SYSIBM","SYSFUN"and there is a LENGTH function defined in schema SHAREFUN with the same number and types of arguments as SYSIBM.LENGTH, then an unqualified reference to LENGTH in this user's SQL statement will result in selecting SHAREFUN.LENGTH. 但是,如果用户的 SQL 路径定义为:"SHAREFUN","SYSFUN"并且存在相同的 SHAREFUN.LENGTH 函数,那么在此用户的 SQL 语句中对 LENGTH 的未限定引用将导致选择 SYSIBM.LENGTH,因为 SYSIBM 隐式地出现在路径中的第一个。- 切勿将内置函数的名称用于用户定义的函数。
- 如果由于某种原因需要创建与内置函数同名的用户定义函数,请确保限定对其的任何引用。
函数解析示例
- 这是说明函数解析中的 SQL 路径注意事项的示例。 对于此示例,在三个不同的模式中,有八个 ACT 函数注册为:
CREATE FUNCTION AUGUSTUS.ACT (CHAR(5), INT, DOUBLE) SPECIFIC ACT_1 ... CREATE FUNCTION AUGUSTUS.ACT (INT, INT, DOUBLE) SPECIFIC ACT_2 ... CREATE FUNCTION AUGUSTUS.ACT (INT, INT, DOUBLE, INT) SPECIFIC ACT_3 ... CREATE FUNCTION JULIUS.ACT (INT, DOUBLE, DOUBLE) SPECIFIC ACT_4 ... CREATE FUNCTION JULIUS.ACT (INT, INT, DOUBLE) SPECIFIC ACT_5 ... CREATE FUNCTION JULIUS.ACT (SMALLINT, INT, DOUBLE) SPECIFIC ACT_6 ... CREATE FUNCTION JULIUS.ACT (INT, INT, DECFLOAT) SPECIFIC ACT_7 ... CREATE FUNCTION NERO.ACT (INT, INT, DEC(7,2)) SPECIFIC ACT_8 ...函数引用如下 (其中 I1 和 I2 是 INTEGER 列, D 是 DECIMAL 列):SELECT ... ACT(I1, I2, D) ...假定执行此引用的应用程序已建立 SQL 路径,如下所示:"JULIUS","AUGUSTUS","CAESAR"通过算法进行跟踪 ...- 将除去具有特定名称 ACT_8 的函数作为候选函数,因为 SQL 路径中不包含模式 NERO。
- 具有特定名称 ACT_3 的函数将作为候选项消除,因为它具有错误数量的参数。 将消除 ACT_1 和 ACT_6 ,因为在这两种情况下,无法将第一个自变量提升到第一个参数的数据类型。
- 由于剩余多个候选项,因此将按顺序考虑这些自变量。
- 对于第一个自变量,其余函数 ACT_2, ACT_4, ACT_5和 ACT_7 与自变量类型完全匹配。 不能从考虑中消除任何函数; 因此必须检查下一个自变量。
- 对于此第二个自变量, ACT_2, ACT_5和 ACT_7 是完全匹配项,但 ACT_4 不是完全匹配项,因此会将其排除在考虑之外。 将检查下一个自变量以确定 ACT_2, ACT_5和 ACT_7之间的某些差别。
- 对于第三个和最后一个自变量, ACT_2, ACT_5和 ACT_7 都不与自变量类型完全匹配。 虽然 ACT_2 和 ACT_5 同样良好,但 ACT_7 不如其他两个,因为类型 DOUBLE 比 DECFLOAT 更接近 DECIMAL。 ACT_7 已消除。。
- 还有两个函数 ( ACT_2 和 ACT_5) 具有相同的参数特征符。 最后一个仲裁是查看 SQL 路径中最先出现的函数的模式,在此基础上,选择的函数是 ACT_5 。
- 这是函数解析将导致错误的情况示例 (SQLSTATE 428F5) ,因为多个候选函数与调用的拟合程度相同,但其中一个自变量的相应参数不属于同一类型优先顺序列表。对于此示例,单个模式中只有三个函数定义如下:
CREATE FUNCTION CAESAR.ACT (INT, VARCHAR(5), VARCHAR(5))SPECIFIC ACT_1 ... CREATE FUNCTION CAESAR.ACT (INT, INT, DATE) SPECIFIC ACT_2 ... CREATE FUNCTION CAESAR.ACT (INT, INT, DOUBLE) SPECIFIC ACT_3 ...函数引用如下 (其中 I1 和 I2 是 INTEGER 列, VC 是 VARCHAR 列):SELECT ... ACT(I1, I2, VC) ...假定执行此引用的应用程序已建立 SQL 路径,如下所示:"CAESAR"通过算法进行跟踪 ...- 将对每个候选函数进行求值,以确定函数调用的每个输入自变量的数据类型是否与函数实例的相应参数的数据类型匹配或可提升:
- 对于第一个自变量,所有候选函数都与参数类型完全匹配。
- 对于第二个自变量,将消除 ACT_1 ,因为 INTEGER 不可提升为 VARCHAR。
- 对于第三个自变量,将同时消除 ACT_2 和 ACT_3 ,因为 VARCHAR 不可提升为 DATE 或 DOUBLE ,因此不会保留任何候选函数。
- 由于候选函数的子集为空,因此将使用可级联过程来考虑候选函数:
- 对于第一个自变量,所有候选函数都与参数类型完全匹配。
- 对于第二个自变量,将消除 ACT_1 ,因为 INTEGER 不可提升为 VARCHAR。 ACT_2 和 ACT_3 是更好的候选者。
- 对于第三个自变量, ACT_2 和 ACT_3 的相应参数的数据类型不属于同一数据类型优先顺序列表,因此将返回错误 (SQLSTATE 428F5)。
- 将对每个候选函数进行求值,以确定函数调用的每个输入自变量的数据类型是否与函数实例的相应参数的数据类型匹配或可提升:
- 此示例说明了函数解析将使用可强制转换进程成功的情况。 对于此示例,单个模式中只有三个函数定义如下:
CREATE FUNCTION CAESAR.ACT (INT, VARCHAR(5), VARCHAR(5))SPECIFIC ACT_1 ... CREATE FUNCTION CAESAR.ACT (INT, INT, DECFLOAT) SPECIFIC ACT_2 ... CREATE FUNCTION CAESAR.ACT (INT, INT, DOUBLE) SPECIFIC ACT_3 ...函数引用如下 (其中 I1 和 I2 是 INTEGER 列, VC 是 VARCHAR 列):SELECT ... ACT(I1, I2, VC) ...假定执行此引用的应用程序已建立 SQL 路径,如下所示:"CAESAR"通过算法进行跟踪 ...- 将对每个候选函数进行求值,以确定函数调用的每个输入自变量的数据类型是否与函数实例的相应参数的数据类型匹配或可提升:
- 对于第一个自变量,所有候选函数都与参数类型完全匹配。
- 对于第二个自变量,将消除 ACT_1 ,因为 INTEGER 不可提升为 VARCHAR。
- 对于第三个自变量,将同时消除 ACT_2 和 ACT_3 ,因为 VARCHAR 不可提升为 DECFLOAT 或 DOUBLE ,因此不会保留任何候选函数。
- 由于候选函数的子集为空,因此将使用可级联过程来考虑候选函数:
- 对于第一个自变量,所有候选函数都与参数类型完全匹配。
- 对于第二个自变量,将消除 ACT_1 ,因为 INTEGER 不可提升为 VARCHAR。 ACT_2 和 ACT_3 是更好的候选者。
- 对于第三个自变量, DECFLOAT 和 DOUBLE 都位于相同的数据类型优先顺序列表中, VARCHAR 可以隐式强制转换为 DECFLOAT 和 DOUBLE。 由于 DECFLOAT 是用于隐式强制类型转换的更好拟合,因此 ACT_2 是最佳拟合
- 将对每个候选函数进行求值,以确定函数调用的每个输入自变量的数据类型是否与函数实例的相应参数的数据类型匹配或可提升:
- 此示例说明在使用可级联过程的函数解析期间,提升后面的自变量优先于隐式强制类型转换。 对于此示例,单个模式中只有三个函数定义如下:
CREATE FUNCTION CAESAR.ACT (INT, INT, VARCHAR(5))SPECIFIC ACT_1 ... CREATE FUNCTION CAESAR.ACT (INT, INT, DECFLOAT) SPECIFIC ACT_2 ... CREATE FUNCTION CAESAR.ACT (INT, INT, DOUBLE) SPECIFIC ACT_3 ...函数引用如下所示 (其中 I1 是 INTEGER 列, VC1 是 VARCHAR 列, C1 是 CHAR 列):SELECT ... ACT(I1, VC1, C1) ...假定执行此引用的应用程序已建立 SQL 路径,如下所示:"CAESAR"通过算法执行以下操作:- 将对每个候选函数进行求值,以确定函数调用的每个输入自变量的数据类型是否与函数实例的相应参数的数据类型匹配或可提升:
- 对于第一个自变量,所有候选函数都与参数类型完全匹配。
- 对于第二个自变量,将消除所有候选函数,因为 VARCHAR 不可提升为 INTEGER ,因此不会保留任何候选函数。
- 由于候选函数的子集为空,因此将使用可级联过程来考虑候选函数
- 对于第一个自变量,所有候选函数都与参数类型完全匹配。
- 对于第二个自变量,没有任何一个候选函数具有可将相应自变量提升到的参数,因此不会消除任何候选函数。
- 由于可以将第三个参数提升到 ACT_1的参数,但不能提升到 ACT_2 或 ACT_3的参数,因此 ACT_1 是最合适的。
- 将对每个候选函数进行求值,以确定函数调用的每个输入自变量的数据类型是否与函数实例的相应参数的数据类型匹配或可提升:
