NUMBER 数据类型支持使用 Oracle NUMBER 数据类型的应用程序。
db2set DB2_COMPATIBILITY_VECTOR=10
db2stop
db2start
要充分利用 Oracle 应用程序的 DB2 兼容性功能部件,DB2_COMPATIBILITY_VECTOR 的推荐设置是 ORA,这将设置所有兼容性位。创建启用了 NUMBER 支持的数据库之后,将 number_compat 数据库配置参数设置为 ON。
如果创建启用了 NUMBER 支持的数据库,那么无法禁用该数据库的 NUMBER 支持,即使重置 DB2_COMPATIBILITY_VECTOR 注册表变量也是如此。同样,如果创建启用了 NUMBER 支持的数据库,那么以后无法启用该数据库的 NUMBER 支持,即使通过设置 DB2_COMPATIBILITY_VECTOR 注册表变量也是如此。
将 number_compat 数据库配置参数设置为 ON 的效果如下所示。
数字文字支持未更改:整数、十进制和浮点常量的规则仍适用。这些规则将十进制文字限制为 31 位,并将浮点文字限制为二进制双精度浮点值的范围。如果有必要,对于超出 DECIMAL 或 DOUBLE 的范围并在 DECFLOAT(34) 范围内的值,可以使用字符串到 DECFLOAT(34) 的强制类型转换(使用 CAST 规范或 DECFLOAT 函数)。目前,既不支持以 D 结尾的数字文字(它表示 64 位二进制浮点值),也不支持以 F 结尾的数字文字(它表示 32 位二进制浮点值)。包含 E 的数字文字的数据类型为 DOUBLE,您可以使用 CAST 规范或使用强制类型转换函数 REAL 将其强制转换为 REAL
如果通过使用 CAST 规范或者使用 VARCHAR 或 CHAR 标量函数将 NUMBER 数据值强制转换为字符串,那么将从结果中除去所有前导零。
用于 CREATE SEQUENCE 语句中的序列值的缺省数据类型是 DECIMAL(27) 而不是 INTEGER。
所有涉及 DECIMAL 或 DECFLOAT 数据类型的算术运算以及算术或数学函数实际都使用十进制浮点算术进行运算,并返回数据类型为 DECFLOAT(34) 的值。此类型的性能还适用于两个操作数都是 DECIMAL 或 DECFLOAT(16) 数据类型的算术运算,这与《表达式中有关十进制算术的描述有所不同。 另外,所有只涉及整数数据类型(SMALLINT、INTEGER 或 BIGINT)的除法运算实际上都使用十进制浮点算术执行。这些操作返回数据类型为 DECFLOAT(34) 的值,而不是整数数据类型。用整数除以零的运算将返回无穷大和警告,而不是返回错误。
| 源数据类型 | 目标数据类型 | |||
|---|---|---|---|---|
| 整数类型 | DECIMAL | DECFLOAT | REAL/DOUBLE | |
| 整数类型 | 不适用 | 不适用 | decflt_rounding | round_half_even |
| DECIMAL | decflt_rounding | decflt_rounding | decflt_rounding | round_half_even |
| DECFLOAT | decflt_rounding | decflt_rounding | decflt_rounding | round_half_even |
| REAL/DOUBLE | 截断 | decflt_rounding | decflt_rounding | round_half_even |
| 字符串(仅适用于强制类型转换) | 不适用 | decflt_rounding | decflt_rounding | round_half_even |
如果已对 DB2 数据库服务器启用 NUMBER 数据类型支持,那么与该服务器配合使用的客户机应用程序将永远不会从该服务器接收到 NUMBER 数据类型。在 DB2 服务器上,任何要从 Oracle 服务器上报告 NUMBER 的列或表达式都会报告 DECIMAL 或 DECFLOAT。
由于 Oracle 环境期望舍入方式为 round-half-up,因此客户机舍入方式与服务器舍入方式匹配至关重要。这意味着,db2cli.ini 文件设置必须与 decflt_rounding 数据库配置参数的值匹配。要最接近匹配 Oracle 舍入方式,应该为数据库配置参数指定 ROUND_HALF_UP。