现象描述

达梦数据库参数为默认参数。

CEIL(n):求大于或等于数值 n 的最小整数,n 必须是数值类型,返回类型与 n 的类型相同。

情况1:n为指定的一个数值

SQL> select ceil(11.1) from dual;

行号       CEIL(11.1)
---------- ----------
1          12

已用时间: 7.058(毫秒). 执行号:204.

Oracle数据库中:

SQL> select ceil(11.1) from dual;

CEIL(11.1)
----------
	12

可以观察到,n为指定的一个数值的情况下,结果与Oracle中相同。

情况2:n为数值表达式

达梦数据库参数为默认参数。测试如下:

disql中执行结果如下:

SQL> select (SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60 from dual;

行号       (SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60
---------- --------------------------------------------------------------------
1          2.896666666666667E+001

SQL> select ceil((SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60) from dual;

行号       CEIL((SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60)
---------- --------------------------------------------------------------------------
1          3.100000000000000E+001

SQL> select to_char(ceil((SYSDATE - to_date('2020-10-26 10:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60)) from dual;

行号       TO_CHAR(CEIL((SYSDATE-TO_DATE('2020-10-2610:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60))
---------- -----------------------------------------------------------------------------------
1          6.31E2

管理工具中执行结果如下:

image-20201026211249033

image-20201026211318675

image-20201026211345578

结果可能不一样因为SYSDATE是变化的,但是可以观察到to_char(ceil(表达式))的结果是使用科学记数法表示的。并且CEIL对表达式求值时返回的结果并不是整数

Oracle中:

sqlplus中执行:

SQL> select (SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60 from dual;

(SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDHH24:MI:SS'))*24*60
--------------------------------------------------------------------
							  36.4333333

SQL> select ceil((SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60) from dual;

CEIL((SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDHH24:MI:SS'))*24*60)
--------------------------------------------------------------------------
									37

SQL> select to_char(ceil((SYSDATE - to_date('2020-10-26 10:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60)) from dual;

TO_CHAR(CEIL((SYSDATE-TO_DATE('2020-10-2
----------------------------------------
637

可以观察到在Oracle中结果为整数,且to_char(ceil(表达式))结果也为整数。

原因

参考《达梦数据库整数除法等运算默认舍弃小数》,猜测可能和CALC_AS_DECIMAL参数的取值有关。该参数为静态参数,取值如下:

0:默认值,表示整数类型的除法、整数与字符或BINARY串的所有四则运算,结果都处理成整数;
1:表示整数类型的除法全部转换为DEC(0,0)处理;
2:表示将整数与字符或BINARY串的所有四则运算都转换为 DEC(0,0)处理
注:该参数只有在USE_PLN_POOL为0或1时有效。当USE_PLN_POOL为2或3时,按照CALC_AS_DECIMAL=2处理(USE_PLN_POOL默认为1)

进行验证测试:

1、设置CALC_AS_DECIMAL参数值为2,并重启数据库生效

SQL> sp_set_para_value(2,'CALC_AS_DECIMAL',2);
--重启数据库;
SQL> select para_name,para_value from v$dm_ini where para_name='CALC_AS_DECIMAL';

行号       PARA_NAME       PARA_VALUE
---------- --------------- ----------
1          CALC_AS_DECIMAL 2

2、执行测试SQL

SQL> select (SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60 from dual;

行号       (SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60
---------- --------------------------------------------------------------------
1          65.0666666666664

已用时间: 1.199(毫秒). 执行号:5.
SQL> select ceil((SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60) from dual;

行号       CEIL((SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60)
---------- --------------------------------------------------------------------------
1          66

已用时间: 0.650(毫秒). 执行号:6.
SQL> select to_char(ceil((SYSDATE - to_date('2020-10-26 10:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60)) from dual;

行号       TO_CHAR(CEIL((SYSDATE-TO_DATE('2020-10-2610:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60))
---------- -----------------------------------------------------------------------------------
1          666

已用时间: 0.640(毫秒). 执行号:7.

可以观察到,将CALC_AS_DECIMAL参数设置为2生效后,结果与Oracle中执行相同。

解决

修改CALC_AS_DECIMAL参数值为2,并重启数据库生效并验证。

Step1:sp_set_para_value(2,‘CALC_AS_DECIMAL’,2);

Step2:重启数据库

总结

达梦数据库默认情况下,一些函数的运算处理与Oracle的处理稍有区别。

对于与Oracle存在区别的地方,在达梦数据库中大部分都可以直接通过调整参数解决与Oracle的兼容性,这对于程序来说可以省掉部分的代码调整工作。

更多资讯请上达梦技术社区了解:https://eco.dameng.com

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐