oracle12c版本和达梦一些函数区别问题

oracle12c版本下和达梦一些语法上的区别

最近在做达梦数据库迁移到oracle12c数据上遇到了一些问题,主要在于达梦和oracle12c版本下一些函数、函数的使用上一些区别,整理了一下,大家在使用oracle12c版本时需要注意。

1、WM_CONCAT函数

WM_CONCAT函数在oracle12c以上版本中已经抛弃,不在使用,所以使用WM_CONCAT()函数会报错,可以用listagg()列转行函数进行替换。

达梦下:wm_concat(to_char(JLMARK.DMCPT))
oracle12下:listagg(to_char(JLMARK.DMCPT),',')within group ( order by JLMARK.INPFRQ)

2、两日期相减得天数

在达梦、oracle10g版本下可以直接使用两个日期类型的字段进行相减可以直接得到天数,再用to_number()函数可区别相对应的天数,在oracle12c版本上两个日期相减得到的不是一个number类型的数值,在进行to_number()函数进行转换时会报错。

达梦下:TO_NUMBER(sysdate - createtime)
oracle12下:to_number(to_date(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss')-to_date(to_char(createtime,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'))

在这块为啥先用to_char格式化日期,是因为直接使用to_date()函数转换时在oracle12c版本上会报错类型不一致问题,所以先用to_char()将字段类型改为一致,在进行to_date()进行转换即可。

3、listagg函数注意事项

在oracle12c版本上多条记录在进行列转行时注意如果有null值时,就会导致结果出现乱码问题,需要用to_char(字段,‘’)进行转换一下,避免出现结果乱码问题。

达梦下:listagg(name)
oracle12下:listagg(to_char(name),',')

4、nullif函数

nullif用来比较两边的值是否相等,如果两个表达式相等,NULLIF 返回空值NULL。如果两个表达式不相等,NULLIF 返回第一个 expression1 的值。在oracle12c版本上需要保持两个表达式的数据类型一致,否则报错,达梦上部分情况下不需要保持一致即可执行成功。

XZBZSY number 类型
达梦下:nullif(XZBZSY,'0')
oracle12下:nullif(XZBZSY,null)

5、日期类型需要转换

在oracle12c版本下,数据库的日期返回到controller时,如果返回对象为map接收时,将map封装成jsonObject对象时,如果日期不进行to_char()转换时,在进行封装时就会报错(net.sf.json.JSONObject cannot be cast to java.lang.String)

达梦下:CREATETIME
oracle12下:to_char(CREATETIME,'yyyy-MM-dd HH24:mi:ss')

6、concat函数

达梦环境下concat函数中参数可以为多个,在oracle12c环境下concat函数只允许将两个值连接在一起。如果需要连接多个值,那么我们可以嵌套多个CONCAT函数调用。

达梦下:CONCAT('A', 'B','C')
oracle12下:CONCAT(CONCAT('A', 'B'),'C')

你可能感兴趣的:(数据库,sql)