原来一使用ssh开发的项目,因实际需要,要从oracle迁移到postgresql。
理想
1.postgresql中创建相关表,把数据从oracle导到postgresql中
2.复制postgresql的jdbc包到项目中
3.配置jdbc参数,及方言
4.大功告成
现实
1,2,3顺利完成
但并没有大功告成
分析
主要的错误为两类:
1. 不支持 connect by ... start with语法
2. 不支持 a.id=b.id(+) 语法
原项目中大量使用了上述两种语句,在postgresql中要相应修改
解决
1. 递归查询
postgresql 支持两种递归查询语法,本人倾向于使用 with recursive 语法,如:
with recursive rec as ( select p_id, id, code, name from t_menu where id=[start with value] union all select m.p_id, m.id, m.code, m.name from t_menu m, rec r where r.id = m.p_id /* connect by part*/ ) select * from rec
2. 外连接
改用 left outer join [table] on a.[field]=b.[field] 语法,如:
select a.* from a, b where a.id=b.id(+) and a.type=?
更改为:
select a.* from a left outer join b on a.id=b.id where a.type = ?
3. 比较庆幸原项目没有使用存储过程、函数及其他oracle专有功能,如:序列、同义词、物化视图、job等,否则迁移起来更麻烦。
最后
留一个外连接的题目,看看大家能否正确的转换成postgresql语句
select a.a_id, b.b_id, c.c_id from a, b, c where a.b_id = b.b_id(+) and b.c_id = c.c_id(+)
left join 直接搞定######几大sql 服务器都有各自的优化语法。没办法。要么改成通用的sql######楼主说的东西, OSC顶多能有 0.1% 能看懂
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。