夏侯惇和杨戬谁厉害:DECIMAL类型除法计算的注意事项&SQL0419N

来源:百度文库 编辑:偶看新闻 时间:2024/05/05 01:49:23
DB2 decimal类型做算术运算的结果精度遵循下面规则
---------------------------------------------------------------------
操作数1             操作数2             结果
DECIMAL(w, x)  DECIMAL(y, z)  DECIMAL(p, s) 
                              p = max(x,z)+max(w-x,y-z)
                              s = max(x,z) 

但除法的小数位计算遵循下面规则: 31-p+s-s'
(The symbols p and s denote the precision and scale of the first operand, and the symbols p' and s' denote the precision and scale of the second operand.)

SUM的话用describe select SUM(col1),  SUM(col2) from table fetch first 1 rows only来检查实际的精度
 SQL 类型              类型长度      列名                           名称长度 --------------------  -----------  ------------------------------  ----------- 485   DECIMAL               31, 3  col1                                             9 485   DECIMAL               31, 5  col2                                             9做SUM运算后的结果精度变为31位,按31-p+s-s'公式结果精度为负数。
解决方法:1.尽量不要使用Decimal,使用Float或者Double2.更改数据库参数,如下:

min_dec_div_3 -“十进制除法,小数位为 3 的”配置参数

此参数提供了一种快速方法来更改 SQL 中十进制除法的小数位计算结果。

配置类型
数据库
参数类型
可配置
缺省值 [范围]
No [Yes, No ]

min_dec_div_3 数据库配置参数会更改十进制除法算术运算的结果小数位。它可以设置为“Yes”或“No”。min_dec_div_3 的缺省值为“No”。如果值为“No”,那么小数位计算为 31-p+s-s'。如果设置为“Yes”,那么小数位计算为 MAX(3, 31-p+s-s')。这会导致十进制小数部分始终至少具有 3 位的小数位。精度始终为 31。

更改此数据库配置参数可能会导致更改现有数据库的应用程序。当更改此数据库配置参数会影响十进制小数部分的结果小数位时,就可能发生此情况。下面列示的是可能会影响应用程序的一些可能的情况。在使用现有数据库的数据库服务器上更改 min_dec_div_3 之前应该考虑这些情景说明。
  • 如果更改其中一个视图列的结果小数位,那么对于在某一环境中用一个设置定义的视图,当更改数据库配置参数之后引用该视图时,该视图可能失败,返回 SQLCODE -344。消息 SQL0344N 指的是递归公共表表达式,但是,如果对象名(第一个标记)是一个视图,那么您将需要删除此视图并再次创建它,以避免此错误。
  • 在隐式或显式重新绑定静态程序包之后,静态程序包才会更改行为。例如,将值从 NO 更改为 YES 之后,在执行重新绑定之后,才会在结果中包括附加的小数位。对于任何已更改的静态程序包,显式 REBIND 命令可以用来强制重新绑定。
  • 涉及十进制小数部分的检查约束可能会限制先前已接受的某些值。这种行现在违犯约束,但在更新涉及检查约束行的其中一列或处理带有 IMMEDIATE CHECKED 选项的 SET INTEGRITY 语句之前检测不到。要强制检查这样的约束,执行 ALTER TABLE 语句以删除检查约束,然后执行 ALTER TABLE 语句来再次添加该约束。
注: min_dec_div_3 还有下列限制:
  1. 命令 GET DB CFG FOR DBNAME 将不显示 min_dec_div_3 设置。确定当前设置的最好方法是观察十进制小数结果的副作用。例如,考虑如下语句:
    VALUES (DEC(1,31,0)/DEC(1,31,5))
    如果此语句返回 SQL 代码 SQL0419N,那么该数据库不具有 min_dec_div_3 支持,或者已将它设置为“No”。如果该语句返回1.000,那么 min_dec_div_3 设置为“Yes”。
  2. 当运行下列命令时,在配置关键字列表中不会出现 min_dec_div_3? UPDATE DB CFG
参考SUM聚合函数

SUM aggregate function

           .-ALL------.                  >>-SUM--(--+----------+--expression--)-------------------------><           '-DISTINCT-'                  

The schema is SYSIBM.

The SUM function returns the sum of a set of numbers.

The argument values must be numbers (built-in types only) and their sum must be within the range of the data type of the result.

The data type of the result is the same as the data type of the argument values, except that:
  • The result is a large integer if the argument values are small integers.
  • The result is double-precision floating point if the argument values are single-precision floating point.
  • The result is DECFLOAT(34) if the argument is DECFLOAT(n).

If the data type of the argument values is decimal, the precision of the result is 31 and the scale is the same as the scale of the argument values. The result can be null.