`
weitao1026
  • 浏览: 1034647 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

PostgreSQL与Oracle的差异对比

 
阅读更多

Postgresql 与 Oracle 相关差异对比

通过查阅资料及实验,以下对比了 Postgresql 9.3 版本与 Oracle 11g版本的相关差异。注意:相关细节仍待考证和完善

1. 基本语法差异

1.1. 基本数据类型差异

Oracle Postgresql
Varchar2 varchar
DATE date/time/timestamp
null null
clob text
blob bytea
number smallint/integer/bigint/numeric/real/double precision
不支持boolean,可通过0/1代替 支持 boolean

1.2. 基本函数差异

Item Oracle Postgresql
字符串连接符 || concat()
‘a’ || null = ‘a’ null
trunc(时间) trunc(date) date_trunc()
取当前系统时间 SYSDATE localtimestamp, now()
to_char, to_number,
to_date
自动格式转换 需指定格式
decode ×
outer join (+) left(right) join
GOTO ×
procedure × 需改写成function
package × 需改写成function

1.2.1. 游标属性

Oracle Postgresql
%FOUND found
%NOTFOUND not found
%ISOPEN ×
%ROWCOUNT ×

1.2.2. 系统内置函数包

Oracle Postgresql
DBMS_OUTPUT ×
DBMS_SQL ×
UTIL_FILE ×
UTIL_MAIL ×

1.3. DDL 差异

1.3.1. Sequence语法及使用差异

Item Oracle Postgresql
create create sequence SEQ_TAB_NAME
minvalue 1
maxvalue 9999999999999999
start with 1 increment by 1
cache 20;
create sequence seq_tab_name
minvalue 1
maxvalue 9223372036854775807
start 1
increment 1
cache 20;
query select seq_tab_name.nextval from dual; select next_val(seq_tab_name) from dual;

注意:pgsql中的 dual,需自主实现。详见兼容性设置->虚表dual问题 章节。

1.3.2. constraint 差异

Item Oracle Postgresql
constraint alter table tab_name add constraint pk_tab_name primary key(column_id) using index; alter table tab_name add constraint pk_tab_name primary key(column_id);

2. 高级语法差异

2.1. 事务差异

Oracle 中,通过 commit/rollback来实现事务提交或回滚。结构类似于:

begin
    select ...
    update ...
    delete ...

    commit;
exception
    when others then
    rollback;
end;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

PostgreSQL 实际上把每个 SQL 语句当做在一个事务中执行来看待。 如果你没有发出BEGIN命令,那么每个独立的语句都被一个隐含的BEGIN 和(如果成功的话)COMMIT包围。一组包围在BEGIN和COMMIT 之间的语句有时候被称做事务块。

例如:

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
-- 呀!加错钱了,应该用 Wally 的账号
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Wally';
COMMIT;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在 PL/pgSQL中,也提供了类似于Oracle 的 Begin、End及ExceptionCode处理机制。他们之间的差异不明显。事实上,PL/SQL(Oracle数据库操作语言)与PL/pgSQL是高度相似的,这让procedure在Oracle与 Postgresql之间迁移变得极为便捷。

2.2. 函数继承与重载

Oracle不支持 继承和重载特性,pgsql支持继承和函数重载;
(待完善)

2.3. 类型转换

pgsql 中的类型转换 “::” 符,Oracle 不支持。

2.4. 子查询

子查询,pgsql要求更严格,必须具有别名才可以;

3. 其他差异

3.1. jdbc差异

Oracle的jdbc连接字符串:db.url=jdbc:oracle:thin:@192.168.1.1:1521:ORCL

Postgresql的连接字符串:db.url=jdbc:postgresql:@192.168.1.1:5432/database

4. 兼容性设置

4.1. 字符串连接兼容性解决方案

Postgresql中没有concat函数,且由于 ||无法使用,需要通过在public schema中创建concat函数来解决。

--在 public schema中创建 concat 函数
create or replace function concat(text, text) returns text as
$body$ select coalesce($1,'') || coalesce($2,'')$body$ language 'sql' volatile;

alter function concat(text, text) owner to postgres;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.2. 虚表 dual 问题

Postgresql中没有 dual 虚拟表,为保证兼容性,需创建伪视图(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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.3. 数据分页问题

Oracle中没有 limit,postgresql中没有rownum。需重写相关语句。

-- Oracle
select * from (
  select * from (
    select * from t1 order by col1, col2
  ) where rownum <=50 order by col3, col4
) where rowmun <=20 order by col5, col6;

-- postgresql
select * from (select * from (select * from t1 order by col1, col2) ta order by col3, col4 limit 50) tb
order by col5, col6 limit 20;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

分享到:
评论

相关推荐

    PostgreSQL & Oracle-备份恢复技术大比拼

    4. PostgreSQL与Oracle的闪回技术对比 5. PostgreSQL与Oracle中逻辑备份工具的使用方法 6. PostgreSQL与Oracle中物理备份和恢复的流程和方法 7. Oracle闪回技术的概念及其应用 8. Oracle逻辑备份的模式和用户模式,...

    Sqlserver、Oracle、MySql、PostgreSql、SqlLite数据库差异

    - **Sqlserver**、**Oracle**、**MySql**、**PostgreSql** 和 **SqlLite** 都提供了丰富的内置函数支持,包括数学、日期时间、字符串处理等多方面功能。 #### 五、分页 分页是数据库中常见的需求之一,不同的...

    PostgreSQL和Oracle区别

    **Oracle**和**PostgreSQL**在创建序列时的最大值设定和缓存机制有所差异: - **Oracle**: 最大值可以设置到非常大的数字,使用`MAXVALUE`参数,同时支持`CACHE`选项来提高性能,但不支持循环(`NOCYCLE`)。 - **...

    PostgreSQL與Oracle跟SQL92 Standard的差異

    在探讨《PostgreSQL与Oracle跟SQL92 Standard的差异》这一主题时,我们主要关注的是三种数据库管理系统在数据类型上的不同之处。这篇文章由许雅婷撰写,作为高等数据库作业的一部分,详细对比了PostgreSQL、Oracle...

    PostgreSQL PG&Oracle-备份技术完美攻略

    在本篇文章中,我们将详细介绍 PostgreSQL 和 Oracle 的备份技术,包括逻辑备份、物理备份、闪回技术等,并对比两者的差异和优缺点。 逻辑备份技术 逻辑备份是指从数据库中提取结构和数据的备份,包括表定义、表...

    SQLServer和Oracle的常用函数对比

    Oracle的`ROUND()`函数用法相同,但结果可能有精度差异。 6. **e为底的幂**: SQLServer使用`EXP()`,如`SELECT EXP(1)`;Oracle同样使用`EXP()`,结果略有不同。 7. **取e为底的对数**: SQLServer使用`LOG()`...

    PostgreSQL 8.2,Oracle 10g,SQL Server 2005,MYSQL 5.1 脚本规范

    标题中的“PostgreSQL 8.2, Oracle 10g, SQL Server 2005, MYSQL 5.1 脚本规范”涉及到的是四个不同的数据库管理系统(DBMS)的脚本编写标准和规范。这四个系统分别是PostgreSQL、Oracle、SQL Server和MySQL,它们都...

    PostgreSQL 最佳性能优化实践授课PPT 386页

    它不仅对PostgreSQL的性能优化策略进行了详尽的阐述,而且对于熟悉MySQL或Oracle的用户也具有很高的参考价值,因为这些数据库系统虽然在语法和实现上有差异,但其性能调优的基本原则是相通的。 **一、PostgreSQL...

    自动对比2个数据库表结构差异

    它可能支持多种数据库系统,如MySQL、Oracle、SQL Server、PostgreSQL等,能快速找出结构上的差异。 对于源码级别的实现,这个工具可能使用编程语言如Java、Python或C#编写,依赖于JDBC、ODBC或其他数据库连接库来...

    PostgreSQL awr

    然而,PostgreSQL作为开源的关系型数据库管理系统,并没有原生支持与Oracle AWR类似的特性。但通过一些第三方工具和自定义脚本,可以在PostgreSQL中实现类似的功能。本篇文章将详细介绍如何在PostgreSQL中实现Oracle...

    EnterpriseDB Oracle兼容性开发者指南.rar

    3. **性能比较与优化**:对比分析EnterpriseDB和Oracle在性能上的差异,提供性能调优的策略和技巧,包括查询优化、索引设计、内存管理等方面。 4. **安全与权限管理**:解释EnterpriseDB的安全模型,如何模拟Oracle...

    Oracle向Greenplum移植

    #### 数据类型对比与建表语句 数据类型对比是移植过程中的关键环节之一,因为Oracle和Greenplum在数据类型的定义上存在差异。例如,Greenplum支持列存储和分布键(DK键),这些特性在构建表时需特别注意。当创建表时,...

    数据库基本语法对比及用法.rar

    本资料主要对比了四种广泛应用的数据库系统:Oracle、MySQL、SQL Server和PostgreSQL,包括它们的基本语法、数据类型、内置函数以及CRUD(创建、读取、更新、删除)操作、游标和存储过程的使用。 1. **Oracle数据库...

    benchmarksql-5.0-pg-oracle-mysql.tar.gz

    7. **优化与对比**:根据测试结果,可以对数据库配置进行优化,或者对比不同数据库系统的性能差异,为数据库选型提供数据支持。 综上所述,BenchmarkSQL 5.0是一个强大的数据库性能测试工具,通过其提供的JDBC驱动...

    mysql mysql与其它数据库的对比

    MySQL与其他关系型数据库管理系统(RDBMS)对比,如Oracle、SQL Server、PostgreSQL等。在多个方面存在差异,如开源性、性能、可扩展性、安全性、支持、多租户、数据库管理等。 与 Oracle 对比: 1. 开源性:...

    各种数据库的数据类型对比

    本主题将深入探讨几种常见的数据库系统,包括MySQL、SQL Server、Oracle和PostgreSQL,以及它们各自的数据类型对比。 1. **MySQL数据类型**: MySQL提供了广泛的数据类型,如数值类型(整数、浮点数、定点数)、...

    SQL数据库对比工具

    SQL数据库对比工具可能支持多种数据库管理系统,如MySQL、Oracle、SQL Server、PostgreSQL等,使得不同数据库间的迁移和协作变得轻松。 10. **易用性与用户体验**: 优秀的工具应具有直观的用户界面,使得即使是...

    MySQL-vs-PostgreSQL.pdf

    MySQL的核心部分100%由Sun/MySQL公司拥有,大多数MySQL开发者也为Sun公司工作,这和PostgreSQL由社区共同支持的情况形成鲜明对比。 在性能方面,两者均支持高并发的读写操作,但各自在特定场景下的性能表现和优化...

    数据库安装差异1

    在"数据库安装差异1"中,可能涵盖了不同数据库系统的安装过程对比,例如Oracle、MySQL、SQL Server或PostgreSQL。这些系统的安装界面、默认设置、配置选项等都有所不同,理解这些差异有助于选择最适合的数据库系统并...

    数据库对比工具

    8. **兼容性**:优秀的数据库对比工具不仅要支持MySQL,还可能支持其他数据库系统,如Oracle、SQL Server、PostgreSQL等,以满足多样化的数据库环境需求。 总的来说,数据库对比工具在数据库管理和维护中扮演着不可...

Global site tag (gtag.js) - Google Analytics