注册
达梦除法小数部分取舍控制
培训园地/ 文章详情 /

达梦除法小数部分取舍控制

蔡龙 2023/04/23 1868 1 0

这两天做了下测试,发现DM8一个特性跟PostgreSQL数据库很类似:在做除法时,默认会自动舍弃小数部分,同种情况下Oracle数据库默认会保留小数。

测试情况如下:

  • DM8默认不保留小数部分。
SQL> select  10/3 result from dual;

行号     RESULT     
---------- -----------
1          3

已用时间: 6.454(毫秒). 执行号:700.
  • PostgreSQL默认不保留小数部分
    PG默认也只有整数部分,将数字转换成numeric类型后,结果就包含小数部分:
user=> select  10/3 result from dual;
 result 
--------
      3
(1 行记录)
--转换数据类型后就可以输出小数部分
user=> select  10::numeric/3::numeric result from dual;
       result       
--------------------
 3.3333333333333333
(1 行记录)
  • Oracle默认保留小数部分
SQL> select  10/3 result from dual;

    RESULT
----------
3.33333333
  • DM8修改Oracle兼容参数后测试
    一开始以为是达梦的Oracle兼容参数可以控制其小数部分取舍,调整参数并重新测试:
SQL> alter system set 'COMPATIBLE_MODE' =2 spfile;
DMSQL 过程已成功完成
已用时间: 6.741(毫秒). 执行号:702.
SQL> host /dm8/bin/DmServiceDMSERVER  restart
Stopping DmServiceDMSERVER:                                [ OK ]
Starting DmServiceDMSERVER:                                [ OK ]

SQL> select name,type,value,sys_value,file_value from v$parameter t where name like 'COMPATIBLE_MODE';

服务器[LOCALHOST:5236]:处于普通打开状态
已连接

行号     NAME            TYPE    VALUE SYS_VALUE FILE_VALUE
---------- --------------- ------- ----- --------- ----------
1          COMPATIBLE_MODE IN FILE 2     2         2

已用时间: 5.423(毫秒). 执行号:500.
SQL> select  10/3 result from dual;

行号     RESULT     
---------- -----------
1          3

已用时间: 1.314(毫秒). 执行号:501.

发现还是没有小数部分。

  • DM8设置CALC_AS_DECIMAL参数
    最后查找了《DM8系统管理员手册》,发现CALC_AS_DECIMAL参数可以控制这种情况:
    image.png
    调整后测试:
SQL> select name,type,value,sys_value,file_value from v$parameter t where name like 'CALC_AS_DECIMAL';

行号     NAME            TYPE    VALUE SYS_VALUE FILE_VALUE
---------- --------------- ------- ----- --------- ----------
1          CALC_AS_DECIMAL IN FILE 0     0         0

已用时间: 4.945(毫秒). 执行号:503.
SQL> alter system set 'CALC_AS_DECIMAL' =1 spfile;
DMSQL 过程已成功完成
已用时间: 6.666(毫秒). 执行号:504.
SQL> host /dm8/bin/DmServiceDMSERVER  restart
Stopping DmServiceDMSERVER:                                [ OK ]
Starting DmServiceDMSERVER:                                [ OK ]

SQL> select name,type,value,sys_value,file_value from v$parameter t where name like 'CALC_AS_DECIMAL';

服务器[LOCALHOST:5236]:处于普通打开状态
已连接

行号     NAME            TYPE    VALUE SYS_VALUE FILE_VALUE
---------- --------------- ------- ----- --------- ----------
1          CALC_AS_DECIMAL IN FILE 1     1         1

已用时间: 4.813(毫秒). 执行号:500.
SQL> select  10/3 result from dual;

行号     RESULT                                 
---------- ---------------------------------------
1          3.3333333333333333333333333333333333333

已用时间: 1.040(毫秒). 执行号:501.

发现已经可以显示小数部分了。

  • 总结:
    默认情况下各库的数据运算处理存在部分差异。达梦在设置CALC_AS_DECIMAL参数为1并重启后,可以实现除法保留小数部分。这在做库迁移时需要特别注意,避免出现非预期的执行结果。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服