SQL Plus环境下如何防止Oracle数据库自动舍入,保留原始小数数值?
解决Oracle查询中数值自动舍入的问题
嘿,我来帮你搞定这个Oracle数值显示被自动舍入的问题!你遇到的情况大概率是Oracle默认的数值显示格式或者列存储类型导致的,下面给你几个实用的解决办法:
1. 用TO_CHAR()函数强制指定显示格式
这是最直接的临时方案,不用改表结构或会话设置,每次查询时手动定义数值的显示格式就行:
SELECT TO_CHAR(p.price, '99.99') "Price in SAR" FROM payment p;
这里的'99.99'是格式模型:
- 每个
9代表一个可选数字位(没有的话会显示空格) .用来标记小数点的位置- 如果你的数值可能更大,比如超过两位整数,可以调整格式为
'999.99'来适配
要是不想前面有空格,可以加FM修饰符来去除填充的空格:
SELECT TO_CHAR(p.price, 'FM99.99') "Price in SAR" FROM payment p;
2. 修改会话的默认数值显示格式
要是你不想每次查询都写TO_CHAR(),可以修改当前会话的数值显示规则,这样所有数值查询都会按指定格式展示:
ALTER SESSION SET NUMERIC_FORMAT = '99.99';
执行完这条命令后,再运行你原来的查询:
SELECT p.price "Price in SAR" FROM payment p;
就能看到带小数的原始数值了。不过要注意,这个设置只在当前数据库会话有效,断开连接后就会恢复默认。
3. 检查并调整列的数据类型(如果存储时就被舍入了)
如果上面两种方法都没效果,那可能是你的price列本身是整数类型(比如NUMBER(2)),导致数据插入时就被自动舍入了。这时候得修改列的数据类型来支持小数存储:
ALTER TABLE payment MODIFY price NUMBER(5,2);
NUMBER(5,2)表示这个列总共能存5位数字,其中2位是小数位,完全能容纳你提到的33.75、48.75这类数值。修改完列类型后,重新插入或更新正确的数值,之后查询就能正常显示小数了。
内容的提问来源于stack exchange,提问作者Hadeel
相关产品推荐
相关产品推荐

