×

上云改造-postgresql数据库替换oracle数据库经验总结

底层劳动者 底层劳动者 发表于2024-05-23 14:16:41 浏览1628 评论0

抢沙发发表评论

pg数据库特别好用的插件

pldbgapi(函数调试插件)

orafce(函数兼容插件)

插件的具体介绍和安装这里不做介绍,请自行百度

SQL语句修改

去掉from dual,也可以不去掉,因为orafce插件提供了dual表

序列改造:seq.nextval 改成 nextval(‘seq’)

强制类型转换 此处以numberic为例,字符后面加上 ::numberic,当然也可以创建自定义类型转换函数,以最常见的varchar转numberic为例,用dba账号执行以下语句即可,create cast (varchar as numeric) with inout as implicit,关于自定义类型转换的内容这里不做展开介绍,可自行百度。

Nvl函数换成coalesce,也可以自己再数据库创建一个nvl函数,实现原有的nvl函数功能,虽然orafce提供了nvl函数,但是并没有涵盖所有类型,所以还是需要自己改一下。

子查询必须有别名

Update的set子句中不能出现别名

Sysdate用now()代替,sysdate-1改成now()-interval ‘1 D’,更多关于日期计算方面的内容,可自行百度。

关于递归查询,普通的递归查询

with recursive tmp (staff_id, up_staff_id ) as (

select a.staff_id,a.up_staff_id

from staff a

where a.staff_id = 9527

union all select c.staff_id,c.up_staff_id

from staff c

join tmp t1 on c.staff_id = t1.up_staff_id

) select staff_id from tmp;

递归中如果存在死循环,一种比较好的思路:

with recursive tmp (staff_id, up_staff_id,visited ) as (

select a.staff_id,a.up_staff_id,array[a.staff_id] as visited

from staff a

where a.staff_id = 9527

union all select c.staff_id,c.up_staff_id,t1.visited||c.staff_id

from staff c

join tmp t1 on c.staff_id = t1.up_staff_id

where c.staff_id <> all(t1.visited)

) select staff_id from tmp;

加入一个遍历列表,如果存在再遍历列表里就不再查询。

查询结果如果是map ,查询结果加上用双引号引起来的别名,这是因为pg返回的结果集key值全部为小写,与oracle全部为大写刚好相反。如果项目里大部分都是返回map,且都没使用双引号引起别名,且项目用的是mybatis,可以使用mybatis的对象加工工厂,把所有map返回值的key值都转换成大写,对象加工工厂objectWrapperFactory可自行百度。

字符串类型可以使用=‘’和 is null,但是数值类型只能用 is null,并且字符串类型的=‘’和is null并不等同。

————————————————


原文链接:https://blog.csdn.net/weixin_43124438/article/details/121425863


群贤毕至

访客