转自http://www.dataguru.cn/thread-499637-1-1.html
Oracle迁移到PostgreSQL:
使用Ora2pg的方案将Oracle迁移至PG, 遇到的问题多少与源Oracle数据库有多少与PG不兼容的东西成正比。下面是我们遇到的问题简单总结:
应用程序里面sqlmap.xml 人工REVIEW时的问题发现:
Oracle | PostgreSQL |
dual表 | 没有dual表,可以直接select 1、select user、select xxx |
时间函数(sysdate) |
current_date
current_time
current_timestamp
|
trunc | trunc/date trunc(时间截断函数) |
sys_guid() | 有类似sys_guid的函数uuid_generate_v4,但需要安装,create extension "uuid-oosp". |
nvl | PG可以使用COALESCE |
where rownum < ... | select row_number() over() , * from XXXX或者limit |
| |
PG导入ora2pg产生的迁移脚本时发现的问题:
tables |
DEFAULT Sys_guid();
session# serial# 字段
|
DEFAULT uuid_generate_v4;
去掉#
|
partitions | 父表在tables中已创建,创建子表时,由于大小写问题提示找不到父表。 | 表名称区分大小写,继承父表时,大小写改为与父表相同。增加或减少分区要修改触发器函数。 |
synonyms |
转换过来的语句类似如下:
CREATE VIEW public.tablename AS SELECT * FROM owner.tablename SECURITY DEFINER;
|
PG中没有同义词,自动创建为视图,转换过来的视图名称与存在的表名相同,需要修改视图名称。
SECURITY DEFINER不能加到创建语句的后面,可通过授权来控制权限。
|
packages |
1、PG中没有v$session.(oracle原来的packages里面大多有这个)
select sid, serial# into v_sid, v_serial# from v$session
2、有些转换过来的语句顺序不正确,需要重构。
3、packages自动转换为function,且function会创建到以原来packages命名的schema下
| ora2pg会把Oracle里面的package header转换为同名的schema |
procedures | |
1、dbms_output.put_line('成功插入数据!');-->RAISE NOTICE '%',('成功插入数据!');
2、 dbms_output.put_line(sqlerrm) --- RAISE NOTICE '%', sqlerrm;
3、表的子查询必须包围在圆括弧里并且必须赋予一个别名
4、start with connect by 递归查询在PG中WITH RECURSIVE
|
views |
1、字符类型问题
2、递归查询没有转换成功
3、外连接中的“+”号没有转换
4、DECODE函数需要重构
5、COALESCE 函数返回值类型不匹配
|
1、字符类型需要调整。
2、start with connect by 递归查询在PG中WITH RECURSIVE
3、 (+)这样的外连接写法需要调整为SQL标准的 table1 [LEFT|RIGHT|FULL] OUTER JOIN table2 ON (...);
4、DECODE函数需要重构成(case when some_column = 'some_value' then 'some_other_value' when ... then ... else 'some_default_value' end ) as some_column;
5、COALESCE 函数返回值类型不匹配、需要类型转换。
|