oracle迁移postgreSql 总结


oracle 迁移 postgreSql 总结

一、迁移策略

1、pg大小写不敏感,所有大写的内容pg会自动识别或转换为小写,建表时,表名,字段名,序列名,索引名等,都用小写,除大小写以外与之前Oracle的命名规则一致。

2、字段类型选择,涉及金额等最好使用numeric(n,m);涉及时间最好使用timestamp;字符串类型用varchar(n);较长字符串用varchar或text;主键类型int4或int8。

 二.可能会出现的报错和解决方案

1.No operator matches the given name and argument types. You might need to add explicit type casts.

原因:=两边的数据类型不同,varchar不能=number

解决:不改数据类型的情况下,使用CAST(* AS *)

2.时间计算使用date_part('second', now()-T.create_time)

3.For example, FROM (SELECT ...) [AS] foo.

原因:由于Oracle的rownum导致

解决:用ROW_NUMBER()OVER()) AS lineNum代替,分页查询试用封装好的PG方法

4.Oracle start with递归查询在PG报错

原因:PG不支持start with

解决:使用WITH RECURSIVE方法查询,具体要看sql复杂度

5.oracle的decode函数在PG不能用

解决:pg使用case when order_count = 0 then 1 else order_count end 代替decode

6.oracle的递归函数在PG不能用

StringBuffer sbSql = new StringBuffer(baseSql);

StringBuilder unionSql = new StringBuilder(unSql);

String baseSql = "WITH RECURSIVE trs AS ( select a.*,b.org_name sysOrgName from tb_org a left join tb_org_main b on a.org_id=b.org_id where 1=1 ";

//这里是需要有一个

unionSql.append(" ) SELECT * FROM trs ");

//合并sql

sbSql.append(" union all ").append(unionSql);

String unSql = "SELECT b.*,o.org_name sysOrgName FROM tb_org b LEFT JOIN tb_org_main o ON b.sys_org_id=o.org_id JOIN trs ON trs.hall_id = B.parent_org_id WHERE 1=1";

7 当前时间 SYSDATE 可全部使用current_timestamp替换

8 序列 SEQNAME.NEXTVAL替换为 NEXTVAL('SEQNAME')

9 固定值列 SELECT '1' AS COL1 SELECT CAST('1' AS TEXT) AS COL1

10 NVL NVL函数 NVL可以用COALESCE函数替换

11 类型自动转换 Oracle某些情况下支持类型自动转换 会出现类型不匹配等错误,需要在Java或者sql中进行类型转换,使类型匹配

12 INSTR函数 instr('str1','str2') strpos('str1','str2')

13 外连接 Oracle可简写为(+) 用LEFT JOIN等语句替换

14 数据库对象大小写 不区分大小写 创建数据库对象时要小写,这样才不区分SQL的大小写

15 同义词 Oracle支持同义词 用视图代替


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM