oracle 迁移 postgreSql 总结

本文详细介绍了将Oracle数据库迁移到PostgreSQL时的策略,包括表名规则、字段类型选择、常见错误处理(如类型转换、函数替代等),以及针对Oracle特性的转换技巧,如递归查询和同义词的处理。

一、迁移策略

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支持同义词 用视图代替

### 数据库迁移步骤 #### 1. 迁移准备 在开始迁移之前,需要评估当前的Oracle数据库环境,包括数据库结构、数据量、依赖的应用程序等。此外,还需确保目标PostgreSQL数据库环境已经搭建完成,并且具备相应的存储和计算资源[^1]。 #### 2. 安装迁移工具 安装必要的迁移工具,如Ora2Pg,这是一个用于将Oracle数据库迁移PostgreSQL的开源工具。安装Ora2Pg前需要安装一些依赖包,例如Perl解释器、DBD::Oracle模块等[^3]。 #### 3. 配置迁移工具 配置Ora2Pg工具的配置文件ora2pg.conf,设置Oracle数据库的连接参数,如主机名、端口、服务名、用户名和密码等。同时,还需要指定迁移的目标格式为PostgreSQL[^3]。 #### 4. 导出Oracle数据库 使用Ora2Pg工具导出Oracle数据库中的模式(schema)和数据。这一步骤通常包括导出DDL语句和实际的数据文件。导出的DDL语句会被转换为PostgreSQL兼容的形式。 #### 5. 导入PostgreSQL 将导出的模式和数据导入PostgreSQL数据库中。可以使用psql命令行工具或者其他数据库管理工具来执行导入操作。例如,可以使用以下命令验证数据是否成功迁移PostgreSQL: ```bash docker exec -it my-postgres psql -U myuser -d mydb ``` 此命令进入PostgreSQL容器并连接到指定的数据库[^2]。 #### 6. 测试迁移结果 迁移完成后,需要对迁移结果进行测试,确保所有的数据都正确无误地迁移过来,并且应用程序能够正常工作。测试应包括功能测试、性能测试以及数据一致性测试[^1]。 #### 7. 应用调整 由于OraclePostgreSQL之间存在语法差异,可能需要调整应用程序代码以适应新的数据库环境。此外,还需要调整存储过程、触发器等数据库对象以确保它们在PostgreSQL中能够正确运行[^1]。 ### 迁移注意事项 - 在迁移过程中,需要注意数据类型之间的差异,例如日期类型、大对象处理等。 - 需要处理PL/SQL与PL/pgSQL之间的转换,这可能涉及到复杂的逻辑重写。 - 对于大型数据库,考虑采用增量迁移策略,以减少停机时间。 - 迁移期间应保持原Oracle数据库的备份,以便在出现问题时能够恢复数据。 ### 迁移工具 除了Ora2Pg之外,还可以考虑使用其他工具如Kettle(也称为Pentaho Data Integration),它支持多种数据源之间的数据迁移,并且可以通过图形界面设计迁移流程[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值