oracle向PostgreSQL迁移

1. postgreSQL 没有dual
    例子:
    oracle    : select sysdate from dual;
    postgreSQL: select current_timestamp;

    为保证程序兼容性,可创建伪视图(view )替代:

    CREATE OR REPLACE VIEW dual AS
    SELECT NULL::"unknown"
    WHERE 1 = 1;
    ALTER TABLE dual OWNER TO postgres;
    GRANT ALL ON TABLE dual TO postgres;
    GRANT SELECT ON TABLE dual TO public;
    必须授权public 以select 权限

2. sequence
创建和oracle一样,不需要修改创建语句。
例子:create sequence seq_test_1 INCREMENT by 1 MINVALUE 1   NO MAXVALUE start with 1 ; --NO MAXVALUE在oracle不支持
使用有区别:
  1)查看序列 next 值
      select nextval('seq_test_1');
  2)查看序列最近使用值
      select currval('seq_test_1');
  3)序列重置
      方式一
      select setval('seq_test_1',100);

      select currval('seq_test_1');
        currval
       ---------
            100
       (1 row)
       select nextval('seq_test_1');
        nextval
       ---------
            101
       (1 row)
      方式二
      alter sequence seq_test_1 restart with 200;  --注意这个不会修改 currval 的值
      select nextval('seq_test_1');
       nextval
      ---------
           200
       (1 row)
   另:postgreSQL支持使用以下语句查看序列属性
       select * from seq_test_1;

3. postgreSQL 中的||用法与其他数据库不同:
  select a||b from table1;
  当a或b其中一个为null时,该查询返回null。
    如果不希望要这个结果,可以使用COALESCE函数:
    select COALESCE(a,'')||COALESCE(b,'') from table1;

4. postgreSQL 一个类型转换声明一个从一种数据类型到另外一种数据类型的转换。

    CAST ( expression AS type )
    expression::type
    CAST语法遵循 SQL 标准;::语法是PostgreSQL历史用法。

5. COALESCE (expression_1, expression_2, ...,expression_n)
   依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。
   可以替换oracle中的nvl函数。

6. oracle中的MINUS 用 EXCEPT来替代

7. postgreSQL 在FROM子条件中字段须有列名,解决方法用AS 别名

8. 关于''
    oracle                                                postgreSQL
SELECT LENGTH('') AS VALUE1 FROM DUAL                    SELECT LENGTH('') AS VALUE1
[Result]VALUE1=NULL                                      [Result]VALUE1=0

SELECT TO_DATE('','YYYYMMDD') AS VALUE2                  SELECT TO_DATE('','YYYYMMDD') AS VALUE2
FROM DUAL
[Result]VALUE2=NULL                                      [Result]VALUE2=0001-01-01 BC

SELECT TO_NUMBER('',1) AS VALUE3 FROM DUAL               SELECT TO_NUMBER('',1) AS VALUE3
[Result]VALUE3=NULL                                      [Result]不能执行

INSERT INTO TEST(VALUE4)VALUES('')                       INSERT INTO TEST(VALUE4)VALUES('')
[Result]VALUE4=NULL (注:VALUE4字段为数值类型)           [Result]VALUE4=0 (注:VALUE4字段为数值类型)

INSERT INTO TEST(VALUE5)VALUES('')                       INSERT INTO TEST(VALUE5)VALUES('')
[Result]VALUE5=NULL (注:VALUE5字段为字符类型)           [Result]VALUE5=''  (注:VALUE5字段为字符类型,结果为长度为零的字符串)

INSERT INTO TEST(VALUE6)VALUES(TO_DATE('','YYYYMMDD'))   INSERT INTO TEST(VALUE6)VALUES(TO_DATE('','YYYYMMDD'))
[Result]VALUE6=NULL (注:VALUE6字段为时间类型)           [Result]VALUE6=0001-01-01 BC (注:VALUE7字段为时间类型)

9. 常用字符串函数
函数                                                        返回类型    描述                                                                                示例                                结果
substring(string [from int] [for int])                         text    截取子字符串                                                                             substring('Thomas' from 2 for 3)    hom
substr(string, from [, count])                                 text    抽取子字符串。和substring(string from from for count))一样                                 substr('alphabet', 3, 2)            ph
trim([leading | trailing | both] [characters] from string)     text    从字符串string的开头/结尾/两边删除只包含 characters中字符 (缺省是空白)的最长的字符串     trim(both 'x' from 'xTomxx')        Tom

10. 聚集函数
avg、count、max、min、sum用法一样。
to_number to_char具体转换模式可能会有区别。

11. 关联查询

ORACLE:

简单外连接:
SELECT COUNT(DISTINCT(A.COL1)) AS RCOUNT FROM
SCHEMA.PREFIX_TABLE1 A,SCHEMA.PREFIX_TABLE2 B
WHERE 1 = 1
AND A.COL2 = B.COL2(+)
AND A.COL3 > 0
AND A.COL4 = '1'

复杂外连接:
SELECT COUNT(DISTINCT(A.COL1)) AS RCOUNT FROM
SCHEMA.PREFIX_TABLE1 A,SCHEMA.PREFIX_TABLE2 B,SCHEMA.PREFIX_TABLE3 C,SCHEMA.PREFIX_TABLE4 D
WHERE 1 = 1
AND A.COL2 = B.COL2
AND A.COL3 = C.COL3(+)
AND A.COL4 = D.COL4(+)
AND A.COL5 > 0
AND A.COL6 = '1'


postgreSQL:

简单外连接:
select count(distinct(a.col1)) as rcount from
schema.prefix_table1 a left outer join schema.prefix_table2 b on (a.col2 = b.col2)
where 1 = 1
and a.col3 > 0
and a.col4 = '1'

复杂外连接:
select count(distinct(a.col1)) as rcount from
schema.prefix_table1 a inner join schema.prefix_table2 b on (a.col2 = b.col2)
left outer join schema.prefix_table3 c on (a.col3 = c.col3)
left outer join schema.prefix_table4 d on (a.col4 = d.col4)
where 1 = 1
and a.col5 > 0
and a.col6 = '1'

12. PostgresQL 中子查询较为规范,子查询结果集必须拥有alias

ORACLE:
SELECT * FROM (
SELECT * FROM (
SELECT * FROM SCHEMA.PREFIX_TABLE ORDER BY COL1
) WHERE X=1 ORDER BY COL2
) WHERE Y=2 ORDER BY COL3

postgreSQL:

SELECT * FROM (
SELECT * FROM (
SELECT * FROM SCHEMA.PREFIX_TABLE ORDER BY COL1 ALIAS1
) WHERE X=1 ORDER BY COL2 ALIAS2
) WHERE Y=2 ORDER BY COL3

13. rownum
PostgresQL 中没有rownum ,无法 使用where rownum < = X 的方法进行分页,取而代之的是limit X ,offset Y 方法, 而ORACLE 中不允许使用LIMIT X 的 方法
ORACLE:

SELECT * FROM ( SELECT * FROM (SELECT * FROM SCHEMA.PREFIX_TABLE1 ORDER BY COL1 DESC,COL2 ASC) where ROWNUM <= 50 ORDER BY COL3 ASC,COL4 DESC)
WHERE ROWNUM <= 20 ORDER BY COL5 DESC,COL6 ASC;

postgreSQL:

select * from ( select * from (SELECT * FROM SCHEMA.PREFIX_TABLE1 ORDER BY COL1 DESC,COL2 ASC) selb order by col3 asc,col4 desc limit 50 ) sela
order by col5 desc,col6 asc limit 20;

-- 注意!!limit 必须用于order by 之后

-- 例:取1 到50 条数据

select * from VOIP_FEE_RATE temp offset 0 limit 50

附加上 LIMIT和OFFSET 子句之后,你就可以检索原来查询语句查询出来的结果中的一部分数据行:

SELECT select_list
    FROM table_expression
    [LIMIT { number | ALL }] [OFFSET number]

如果给出了一个限制计数,那么返回不超过那么多的行。 (但可能更少些,因为查询本身可能生成的行数就比较少。) LIMIT ALL和省略 LIMIT子句一样。

OFFSET说明在开始返回行之前忽略多少行。 OFFSET 0和省略OFFSET子句是一样的。 如果OFFSET和LIMIT都出现了, 那么在计算LIMIT个行之前忽略OFFSET行。

如果使用LIMIT,那么用ORDER BY 子句把结果行约束成一个唯一的顺序是一个好主意。 否则你就会拿到一个不可预料的该查询的行的子集。 — 你要的可能是第十到二十行,但以什么顺序的十到二十? 除非你声明了ORDER BY,否则顺序是不知道的。

查询优化器在生成查询规划的时候会考虑LIMIT,因此如果你给 LIMIT和OFFSET不同的东西,那么你很可能收到不同的规划(产生不同的行顺序)。 因此,使用不同的LIMIT/OFFSET值选择不同的查询结果的子集将生成不一致的结果, 除非你用ORDER BY强制一个可预料的顺序。这可不是臭虫; 这是一个很自然的结果,因为 SQL 没有许诺把查询的结果按照任何特定的顺序发出,除非用了ORDER BY来约束顺序。

OFFSET 子句忽略的行仍然需要在服务器内部计算;因此,一个很大的 OFFSET 可能还是不够有效率的。 

14. postgreSQL 没有DECODE函数
Oracle:
    SELECT DECODE(ENDFLAG,'1','A','B') ENDFLAGFROM TEST
postgreSQL:
    SELECT (CASE ENDFLAG WHEN '1' THEN 'A'ELSE 'B' END) AS ENDFLAG FROM TEST

15. 当前日期/时间
PostgreSQL提供许多返回当前日期和时间的函数。 这些符合 SQL 标准的函数全部都按照当前事务的开始时刻返回结果:

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision)
LOCALTIME
LOCALTIMESTAMP
LOCALTIME(precision)
LOCALTIMESTAMP(precision)

CURRENT_TIME和CURRENT_TIMESTAMP 返回带有时区的值;LOCALTIME和LOCALTIMESTAMP 返回不带时区的值。

CURRENT_TIME,CURRENT_TIMESTAMP, LOCALTIME,LOCALTIMESTAMP 可以有选择地获取一个精度参数,
该精度导致结果的秒数域园整到指定小数位。 如果没有精度参数,将给予所能得到的全部精度。

一些例子:

SELECT CURRENT_TIME;
Result: 14:39:53.662522-05

SELECT CURRENT_DATE;
Result: 2001-12-23

SELECT CURRENT_TIMESTAMP;
Result: 2001-12-23 14:39:53.662522-05

SELECT CURRENT_TIMESTAMP(2);
Result: 2001-12-23 14:39:53.66-05

SELECT LOCALTIMESTAMP;
Result: 2001-12-23 14:39:53.662522

16. 常见数据类型中两者不同的部分

Oracle数据类型    PostgresQL数据类型
VARCHAR2    VARCHAR
CLOB    TEXT
DATE    DATE/TIME/TIMESTAMP(DATE仅包含日期、TIME仅包含时间、TIMESTAMP均包含,通常使用DATE)
NUMBER    SMALLINT/INTEGER/BIGINT/NUMERIC/REAL/DOUBLE PRECISION(通常可用NUMERIC)
BLOB    BYTEA

17. sql语句执行结果,sqlcode判断PostgresQL和Oracle不完全一样

18. PostgresQL
当创建游标的事务用COMMIT或ROLLBACK终止之后,每个不可保持的已打开游标都隐含关闭。
当创建游标的事务通过ROLLBACK退出之后,每个可以保持的游标都将隐含关闭。
当创建游标的事务成功提交,那么可保持的游标保持打开,直到执行一个明确的CLOSE命令或者客户端断开。 

 

转载自:https://blog.csdn.net/sxtobj/article/details/44201589

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 将Oracle数据库迁移PostgreSQL需要以下步骤: 1. 确定迁移的目标和范围,包括数据库大小、数据类型、表结构、索引、触发器、存储过程等。 2. 在PostgreSQL中创建相应的数据库和表结构,确保与Oracle数据库的结构一致。 3. 将Oracle数据库中的数据导出为SQL文件,然后将其导入到PostgreSQL数据库中。 4. 对于Oracle数据库中的存储过程和触发器,需要将其转换为PostgreSQL的语法,并重新创建。 5. 对于Oracle数据库中的索引和约束,需要根据PostgreSQL的语法进行调整和重新创建。 6. 对于Oracle数据库中的特殊数据类型,如BLOB和CLOB,需要将其转换为PostgreSQL支持的数据类型。 7. 对于Oracle数据库中的特殊功能,如分区表和分布式数据库,需要根据PostgreSQL的功能进行调整和重新实现。 8. 迁移完成后,需要进行测试和验证,确保数据的完整性和正确性。 总之,将Oracle数据库迁移PostgreSQL需要仔细的规划和准备,以确保迁移的顺利和成功。 ### 回答2: Oracle是大型关系数据库管理系统,在企业中应用广泛。然而,随着开源数据库(例如PostgreSQL)的发展,越来越多的企业开始考虑将其数据库迁移到开源数据库上。PostgreSQL是一个强大的、支持高级数据类型的开源数据库,具有高度可扩展性和良好的安全性。 当企业考虑将它们的Oracle数据库迁移PostgreSQL时,需要考虑以下因素: 1. 数据的转换:OraclePostgreSQL之间存在差异,例如,它们的数据类型、架构等有所不同。因此,在将数据从Oracle迁移PostgreSQL时,需要进行适当的数据转换。 2. 应用程序的兼容性:迁移数据库还需要检查现有的应用程序是否与PostgreSQL兼容,以确保它们可以正确地访问新数据库。 3. 业务功能和需求:企业需要根据其业务功能和需求来选择适当的数据库。在进行这种类型的迁移时,需要考虑企业的长期业务规划。 4. 数据库管理员技能:OraclePostgreSQL的管理方式有所不同,因此,企业需要评估其当前的数据库管理员技能,并考虑是否需要培训他们以管理重构后的PostgreSQL数据库。 5. 外部支持和服务:在迁移过程中,企业需要明确了解可用的支持和服务,并考虑与供应商签订合同。 在考虑Oracle数据库迁移PostgreSQL时,需要评估各种因素,并进行适当的规划和准备。正确的数据库迁移可以提高企业的效率和生产力,并为企业拓展未来提供了更多的可能性。 ### 回答3: Oracle是一款常用的关系型数据库,而PostgreSQL则是在开源社区中很受欢迎的关系型数据库管理系统(RDBMS)。在某些情况下,企业可能需要考虑将其Oracle数据库迁移PostgreSQL上。 1. 性能和可扩展性 PostgreSQLOracle在某些方面表现得更好。例如,PostgreSQL在存储和同步数据方面表现更出色并且能够更好地处理高并发请求。此外,与Oracle相比,PostgreSQL的可扩展性更强,这对于需要大规模处理的大型企业来说是非常有益的。 2. 开源 PostgreSQL是一个开源项目,这意味着它拥有很多社区支持,可以获得更高级别的技术支持,从而提高了可靠性和稳定性。但是,Oracle是一个商业产品,需要额外的付费才能获得更好的支持。因此,从成本角度来讲,PostgreSQL是一个更好的选择。 3. 数据迁移 数据库迁移需要快速且高效地完成,如果不小心,就可能导致数据遗失或无法恢复。数据迁移需要先对应用程序和数据库进行访问控制的修改。然后,对于表,索引和视图等所有对象,需要在PostgreSQL中进行重建。标准迁移方式通常涉及导出Oracle数据,将其转换为PostgreSQL可用的格式,然后导入PostgreSQL。 4. 兼容性和转换 OraclePostgreSQL之间的语法和特性是不同的,所以需要进行转换。PostgreSQL的一些功能,例如数组和枚举,在Oracle中是不存在的。需要将数据库转换后再进行使用。除此之外,PostgreSQL有一个更强大的命令行界面,可在迁移过程中缩短学习曲线和响应时间。 总体来说,Oracle迁移PostgreSQL不是一项容易的任务,需要企业在决定迁移之前进行彻底的考虑和规划。但是,一旦完成迁移,就可以获得更好的性能和更具成本效益的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值