ORACLE_NUMBER类型Scale为0引发的问题
今天遇到了一个很有意思的NUMBER类型Scale引发的问题,我用一个简单的测试用例来展示一下这个案例。假如有个TEST的表,有个字段类型为NUMBER,我插入下面两条数据 CREATETABLE TEST ( Category VARCHAR(12),
QTY NUMBER ) INSERT INTO TEST
SELECT'M',12 FROM DUAL UNIONALL 'C',0.99999999999999999 FROM DUAL;
COMMIT; 此时直接查询表TEST,发现QTY字段值为1,
使用下面SQL语句统计时,SUM_QTY的值也是1
但是如果在游标里面获取该值的时候,你会发现字段QTY的值为原来的值.99999999999999999 DECLARE CURSOR c_testIS SELECT Category,SUM(QTY) AS SUM_QTY FROM TEST GROUPBY Category;
c_row c_test%rowtype; begin for c_row in c_test loop
dbms_output.put_line('the result is ' || c_row.SUM_QTY);
end loop; end; the result is .99999999999999999 the result is 12 为什么会有这个奇怪的现象呢? 其实我们遇到这个案例时是按这个顺序反着的,最后发现是插入的值是0.999999999. 当然这个过程是非常纠结的。远非我们例子里面那样轻松简单。要解释这个问题,要从NUMBER类型说起,NUMBER (p,s) 声明一个定点数 p(precision)为精度,s(scale)表示小数点右边的数字个数,精度最大值为38,scale的取值范围为-84到127。 Number(p) 表示声明一个整数相当于Number(p,0), 如果不指定p和s,NUMBER类型,它的默认精度值为38,默认的scale值为0. 所以出现在SELECT语句中,一个值为.99999999999999999 的显示为1,但是在游标中,它获取的是这个字段的真实值,没有经过转化。所以出现了这个稀奇古怪的问题。虽然事后理顺过后觉得非常简单,但是当时不了解情 况下,觉得非常不可思议,非常纳闷!
另外附上定点数的精度(p)和刻度(s)遵循以下规则: 点击打开链接 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |