确定无类型表达式的数据类型

非类型表达式是指使用参数标记,该参数标记是在没有与其关联的目标数据类型的情况下指定的,是在没有与其关联的目标数据类型的情况下指定的空值,或者是 DEFAULT 关键字。

只要满足下列其中一个条件,就可以在 SQL 语句中使用非类型表达式:
  • CLI 或 JDBC 应用程序正在执行 PREPARE 语句以编译 SQL 语句; 客户机接口正在使用延迟准备; 注册表变量 DB2_DEFERRED_PREPARE_SEMANTICS 设置为 YES。 在这种情况下,任何非类型参数标记都将根据与后续 OPEN 或 EXECUTE 语句相关联的输入描述符来派生其数据类型。 根据 UNTYPED 行,将 length 属性设置为最大长度,如 函数 中的 表 2 中所述,并根据下表确定长度。 对于未在 函数表 2 中列示为目标类型的数据类型,将使用来自与后续 OPEN 或 EXECUTE 语句关联的输入描述符的长度。 可以根据 SQL 语句中的非类型参数标记的用法来修改数据类型和长度。
  • 可以根据 SQL 语句中的上下文来确定数据类型。 下表显示了这些位置以及生成的数据类型。 这些位置分组为表达式,谓词,内置函数和用户定义的例程,以帮助确定非类型表达式的适用性。 如果无法根据上下文确定数据类型,那么将发出错误。

对于未列出的某些情况,选择列表中的非类型表达式将解析为根据 SQL 语句中的用法确定的数据类型。

无类型表达式的代码页由上下文确定。 如果没有上下文,那么代码页与非类型表达式已强制转换为 VARCHAR 数据类型的代码页相同。

下面的表显示与数据库环境关联的字符串单元中的字符串和图形字符串数据类型,其中字符串单元缺省值为 SYSTEM。 如果 Unicode 数据库环境将字符串单元设置为 CODEUNITS32,那么表示数据类型最大长度的任何字符串或图形字符串长度属性都应被视为表示 CODEUNITS32中的数据类型最大长度。 所有字符串或图形字符串数据类型都具有数据库环境的缺省字符串单元。

表 1. 表达式中的非类型 表达式 用法 (包括选择列表, CASE和 VALUES)
未指定类型的 Expression 位置 数据类型
单独在选择列表中 如果非类型表达式未命名或已命名但随后未在 SQL 语句中引用,那么将返回错误,除非非类型表达式为空值。 在此类情况下,数据类型为 VARCHAR (1)。

如果指定了非类型表达式并且随后在 SQL 语句中引用了该表达式,那么可以根据后续用法来确定数据类型。 有关更多信息,请参阅此表后面的 "根据使用情况确定数据类型" 注释。

在考虑运算符优先顺序和操作规则顺序之后,单个算术运算符的两个操作数
包括如下案例:
   (? + ?) + 10
DECFLOAT(34)
算术表达式中单个运算符的一个操作数 (不是日期时间表达式)
包括如下案例:
   ? + (? * 10)
其他操作数的数据类型
日期时间表达式中的标记持续时间 (请注意,指示单元类型的标记持续时间部分不能是参数标记) DECIMAL (15, 0)
日期时间表达式的任何其他操作数 (例如, "timecol +?" 或 "? -datecol ') 错误
CONCAT 运算符的两个操作数 VARCHAR(254)
当另一个操作数是非 CLOB 字符数据类型时, CONCAT 运算符的一个操作数 如果一个操作数为 CHAR (n) 或 VARCHAR (n) ,其中 n 小于 128 ,另一个操作数为 VARCHAR (254- n); 在所有其他情况下,数据类型为 VARCHAR (254)
当另一个操作数是非 BLOB 二进制数据类型时, CONCAT 运算符的一个操作数 如果一个操作数为 BINARY (n) 或 VARBINARY (n) ,其中 n 小于 128 ,另一个操作数为 VARBINARY (254- n); 在所有其他情况下,数据类型为 VARBINARY (254)
当另一个操作数是非 DBCLOB 图形数据类型时, CONCAT 运算符的一个操作数 If one operand is either GRAPHIC(N) or VARGRAPHIC(N), where N is less than 64, the other is VARGRAPHIC (127- N); in all other cases, the data type is VARGRAPHIC(127)
CONCAT 运算符的一个操作数,当另一个操作数是大对象字符串时 与其他操作数相同
简单 CASE 表达式中 CASE 关键字后面的表达式 结果数据类型的规则 应用于 WHEN 关键字之后除非非类型表达式的表达式的结果
CASE 表达式中的至少一个结果表达式 (包括简单表达式和搜索表达式) ,其余结果表达式为非类型表达式 错误
简单 CASE 表达式中 WHEN 关键字 后面的任何或所有表达式 结果数据类型的规则 应用于 CASE 之后的表达式以及 WHEN 关键字 之后 非带类型表达式 的表达式的结果
CASE 表达式中的结果表达式 (包括简单表达式和搜索表达式) ,当至少一个结果表达式不是 非类型表达式 结果数据类型的规则 应用于除 非类型化表达式 以外的所有结果表达式的结果
单独作为单行 VALUES 子句中的列表达式,该子句不在 INSERT 语句中,也不在 MERGE 语句的插入操作的 VALUES 子句中 如果非类型表达式未命名或已命名但随后未在 SQL 语句中引用,那么会发生错误。 如果指定了非类型表达式并且随后在 SQL 语句中引用了该表达式,那么可以根据后续用法来确定数据类型。 有关更多信息,请参阅此表后面的 "根据使用情况确定数据类型" 注释。
单独作为多行 VALUES 子句中不在 INSERT 语句中的列表达式,对于该子句,所有其他行表达式中相同位置的列表达式都是无类型表达式 如果非类型表达式未命名或已命名但随后未在 SQL 语句中引用,那么会发生错误。 如果指定了非类型表达式并且随后在 SQL 语句中引用了该表达式,那么可以根据后续用法来确定数据类型。 有关更多信息,请参阅此表后面的 "根据使用情况确定数据类型" 注释。
单独作为多行 VALUES 子句中的列表达式,而该子句不在 INSERT 语句中,并且至少一个其他行表达式的相同位置中的表达式不是非类型 表达式 在除非类型 表达式 以外的所有操作数上应用 结果数据类型规则 的结果
单独作为 INSERT 语句中单行 VALUES 子句中的列表达式 列的数据类型。 如果该列定义为用户定义的单值类型,那么它是用户定义的单值类型的源数据类型。 如果该列定义为用户定义的结构化类型,那么它是结构化类型,也指示变换函数的返回类型。
单独作为 INSERT 语句中多行 VALUES 子句中的列表达式 列的数据类型。 如果该列定义为用户定义的单值类型,那么它是用户定义的单值类型的源数据类型。 如果该列定义为用户定义的结构化类型,那么它是结构化类型,也指示变换函数的返回类型。
单独作为 MERGE 语句的源表的值子句中的列表达式 如果未指定类型的表达式未命名或已命名但随后未在 SQL 语句中引用,那么发生错误。 如果指定了非类型表达式并且随后在 SQL 语句中引用了该表达式,那么可以根据后续用法来确定数据类型。 有关更多信息,请参阅此表后面的 "根据使用情况确定数据类型" 注释。
单独作为 MERGE 语句插入操作的 VALUES 子句中的列表达式 列的数据类型。 如果该列定义为用户定义的单值类型,那么它是用户定义的单值类型的源数据类型。 如果该列定义为用户定义的结构化类型,那么它是结构化类型,也指示变换函数的返回类型。
单独作为 MERGE 语句的更新操作的赋值子句右侧的列表达式 列的数据类型。 如果该列定义为用户定义的单值类型,那么它是用户定义的单值类型的源数据类型。 如果该列定义为用户定义的结构化类型,那么它是结构化类型,也指示变换函数的返回类型。
单独作为 UPDATE 语句中 SET 子句右侧的列表达式 列的数据类型。 如果该列定义为用户定义的单值类型,那么它是用户定义的单值类型的源数据类型。 如果该列定义为用户定义的结构化类型,那么它是结构化类型,也指示变换函数的返回类型。
作为 SET 专用寄存器语句右侧的值 专用寄存器的数据类型
表引用的 tablesample-子句的 TABLESAMPLE 子句的自变量 double
表引用的 tablesample-子句的 REPETABLE 子句的自变量 整数
单独作为 fetch-子句中的 fetch-row-count BIGINT
单独作为 OFFSET 子句中的 offset-row-count BIGINT
作为 FREE LOCATOR 语句中的值 定位器
作为 SET ENCRYPTION PASSWORD 语句中密码的值 VARCHAR(128)
注:
根据使用情况确定数据类型
以下是如何通过后续用法确定非类型表达式的数据类型的示例:

如果随后在比较运算符中引用了指定的非类型表达式,那么它将具有其他操作数的数据类型。 如果 SQL 语句中有多个指定的无类型表达式的引用,那么为每个这些引用单独确定的数据类型,长度,精度,小数位和代码页必须相同或返回错误。

表 2. 未指定类型的 表达式 在谓词中的使用情况
未指定类型的 Expression 位置 数据类型
比较运算符的两个操作数 VARCHAR(254)
比较运算符的一个操作数 (当另一个操作数不是非类型 表达式 时) 其他操作数的数据类型
BETWEEN 谓词的所有操作数 VARCHAR(254)
BETWEEEN 谓词的两个操作数 与唯一 带类型表达式 的表达式相同
仅 BETWEEN 谓词的一个操作数 在除非类型 表达式 以外的所有操作数上应用 结果数据类型规则 的结果
IN 谓词的所有操作数,例如? IN (? ,? ,?) VARCHAR(254)
IN 谓词的第一个操作数,当右侧是全查询时,例如 IN (全查询) 所选列的数据类型
IN 谓词的第一个操作数,当右侧不是子查询时; 例如,? IN (? , A , B) 或? IN (A ,? , B ,?) 将 "结果数据类型规则" 应用于 IN 列表的所有操作数 (IN 关键字右边的操作数) (非类型表达式) 的结果
IN 谓词的 IN 列表的任何或所有操作数,例如, A IN (? , B ,?) 对 IN 谓词的所有操作数 (IN 关键字的左和右操作数) 应用 "结果数据类型规则" 的结果 (非类型表达式)
IN 谓词的行值表达式中的操作数以及全查询的相应结果列,例如 (c1,?) IN (SELECT c1,? 从 ...) VARCHAR(254)
IN 谓词的行值表达式中的任何操作数,例如 (c1,?) IN 全查询 全查询的相应结果列的数据类型
如果在 IN 谓词中指定了 row-value-expression ,那么子查询中的任何选择列表项,例如 (c1,c2) IN (SELECT? , c1, FROM ...) row-value-expression 中相应操作数的数据类型
LIKE 谓词的所有三个操作数 匹配表达式 (操作数 1) 和模式表达式 (操作数 2) 为 VARCHAR (32672); 转义表达式 (操作数 3) 为 VARCHAR (2)
当模式表达式或转义表达式不是非类型 表达式 时, LIKE 谓词的匹配表达式 VARCHAR (32672) , VARBINARY (32672) 或 VARGRAPHIC (16336) ,具体取决于不是非类型 表达式 的第一个操作数的数据类型
当匹配表达式或转义表达式不是非类型 表达式 时, LIKE 谓词的模式表达式 VARCHAR (32672) , VARBINARY (32672) 或 VARGRAPHIC (16336) ,具体取决于不是非类型 表达式的第一个操作数的数据类型。
当匹配表达式或模式表达式不是非类型 表达式 时, LIKE 谓词的转义表达式 VARCHAR (2) , VARBINARY (1) 或 VARGRAPHIC (1) ,具体取决于不是非类型 表达式的第一个操作数的数据类型。
NULL 谓词的操作数 VARCHAR(254)
表 3. 未指定类型的 表达式 在内置函数中的使用
隐式类型参数标记位置 数据类型
ARRAY 的数组下标 BIGINT
当所有自变量都是非类型化参数标记时 COALESCE 的所有自变量 错误
当至少一个自变量不是非类型化参数标记时, COALESCE 的任何自变量 对非带类型参数标记的所有自变量应用 结果数据类型规则 的结果
DAYNAME 的第一个自变量 TIMESTAMP (12)
位的自变量 DECIMAL (31, 6)
FROM_UTC_TIMESTAMP 的第一个自变量 TIMESTAMP (6)
当所有自变量都是非类型化参数标记时, MAX , MIN 或 NULLIF 的所有自变量 错误
当至少一个自变量不是非类型化参数标记时, MAX , MIN 或 NULLIF 的任何自变量 对非带类型参数标记的所有自变量应用 结果数据类型规则 的结果
MONTHNAME 的第一个自变量 TIMESTAMP (12)
POSSTR (两个自变量) 这两个参数都是 VARCHAR (32672)
POSSTR (一个参数,当另一个参数是字符数据类型时) VARCHAR(32672)
POSSTR (一个自变量,当另一个自变量是图形数据类型时) VARGRAPHIC (16336)
POSSTR (搜索字符串参数,当另一个参数是二进制数据类型时) VARBINARY(32672)
REGEXP_LIKE , REGEXP_INSTR , REGEXP_SUBSTR 和 REGEXP_COUNT 的第一个和第二个自变量 VARCHAR(32672)
REGEXP_LIKE , REGEXP_INSTR , REGEXP_SUBSTR 或 REGEXP_SUBSTR 的第一个自变量 (如果第二个自变量不是非类型表达式) VARGRAPHIC (16336) (如果第二个自变量是图形数据类型); 否则为 VARCHAR (32672)
REGEXP_LIKE , REGEXP_INSTR , REGEXP_SUBSTR 或 REGEXP_SUBSTR 的第二个自变量 (如果第一个自变量不是非类型表达式) VARGRAPHIC (16336) 如果第一个自变量是 Unicode 数据库中的图形数据类型; 否则为 VARCHAR (32672)
REGEXP_REPLACE 的前三个自变量 VARCHAR(32672)
当第二个或第三个自变量不是非类型化表达式时, REGEXP_REPLACE 的第一个自变量 VARGRAPHIC (16336) 如果第三个自变量是图形数据类型或第三个自变量是无类型表达式,而第二个自变量是图形数据类型; 否则 VARCHAR (32672)
当第一个或第三个自变量不是非类型化表达式时, REGEXP_REPLACE 的第二个自变量 VARGRAPHIC (16336) 如果第一个自变量是 Unicode 数据库中的图形数据类型; 否则为 VARCHAR (32672)
当第一个或第二个自变量不是非类型化表达式时, REGEXP_REPLACE 的第三个自变量 VARGRAPHIC (16336) 如果第一个自变量是图形数据类型,或者第一个自变量是无类型表达式,而第二个自变量是图形数据类型; 否则 VARCHAR (32672)
SUBSTR 的第一个自变量 VARCHAR(32672)
SUBSTR 的第二个和第三个自变量 INTEGER
SUBSTRB 的第一个自变量 VARCHAR(32672)
SUBSTR2 的第一个自变量 VARGRAPHIC (16336) (如果数据库支持图形类型); 否则 VARCHAR (32672)
SUBSTR4 的第一个自变量 VARCHAR(32672)
TIMESTAMP 的第二个自变量 时间
TIMESTAMP_FORMAT 的第一个自变量 VARCHAR(254)
TO_UTC_TIMESTAMP 的第一个自变量 TIMESTAMP (6)
TRANSLATE 的第二个和第三个自变量 VARCHAR (32672) (如果第一个自变量是字符类型); VARGRAPHIC (16336) (如果第一个自变量是图形类型)
TRANSLATE 的第四个自变量 VARCHAR (1) (如果第一个自变量是字符类型); VARGRAPHIC (1) (如果第一个自变量是图形类型)
TRIM_ARRAY 的第二个自变量 BIGINT
一元减 DECFLOAT(34)
一元加号 DECFLOAT(34)
当所有自变量都是非类型化参数标记时, VALUE 的所有自变量 错误
当至少一个自变量不是非类型化参数标记时, VALUE 的任何自变量 对非带类型参数标记的所有自变量应用 结果数据类型规则 的结果
VARCHAR_FORMAT 的第一个自变量 TIMESTAMP (12)
XMLCOMMENT 的第一个自变量 VARCHAR(32672)
XMLCONCAT 的所有自变量 XML
XMLDOCUMENT 的第一个自变量 XML
XMLELEMENT 或 XMLEXISTS 的自变量 错误
XMLPI 的第二个自变量 VARCHAR(32672)
XMLQUERY 的自变量 错误
XMLSERIALIZE 的第一个自变量 XML
XMLTABLE 的自变量 错误
XMLTEXT 的第一个自变量 VARCHAR(32672)
XMLVALIDATE 的第一个自变量 XML
XMLXSROBJECTID 的第一个自变量 XML
聚集函数的自变量 错误
所有其他标量函数的所有其他自变量 由函数解析确定的函数定义参数的数据类型。 自变量的长度是根据 "函数解析" 部分中的 表 2 派生的。
表 4. 未指定类型的 表达式 在用户定义的例程中的使用情况
隐式类型参数标记位置 数据类型
函数的自变量 参数的数据类型和长度,如创建函数时所定义。
方法的自变量 错误
过程的自变量 参数的数据类型,如创建过程时所定义