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

时间:2025-04-03 18:11:33
  • 去掉from dual,也可以不去掉,因为orafce插件提供了dual表
  • 序列改造: 改成 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,||c.staff_id
    from staff c
    join tmp t1 on c.staff_id = t1.up_staff_id
    where c.staff_id <> all()
    ) select staff_id from tmp;
    加入一个遍历列表,如果存在再遍历列表里就不再查询。
  • 查询结果如果是map ,查询结果加上用双引号引起来的别名,这是因为pg返回的结果集key值全部为小写,与oracle全部为大写刚好相反。如果项目里大部分都是返回map,且都没使用双引号引起别名,且项目用的是mybatis,可以使用mybatis的对象加工工厂,把所有map返回值的key值都转换成大写,对象加工工厂objectWrapperFactory可自行百度。
  • 字符串类型可以使用=‘’和 is null,但是数值类型只能用 is null,并且字符串类型的=‘’和is null并不等同。