1. 程式人生 > >PostgreSQL與Oracle的差異對比

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;

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;

在 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;

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;

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;

注意:limit必須用於 order by 之後!

擴充套件閱讀

相關推薦

PostgreSQLOracle差異對比

Postgresql 與 Oracle 相關差異對比 通過查閱資料及實驗,以下對比了 Postgresql 9.3 版本與 Oracle 11g版本的相關差異。注意:相關細節仍待考證和完善。 1. 基本語法差異 1.1. 基本資料型別差異

文件目錄差異對比方法

python環境:Python 2.6.6linux系統用到的模塊:filecmpfilecmp提供了:單文件對比,多文件對比,目錄對比單文件對比:采用filecmp.cmp(f1,f2[,shallow])方法,比較文件名為f1和f2的文件的內容,相同返回True,不相同返回False,shallow默認是

PostgreSQLOracle對應的函數

get table timestamp -o oal current acl mes 參考 一、對應的函數 1.sysdate oracle pgsql sysdate current_date、 current_timestamp

文件目錄差異對比模塊filecmp

import 不存在 file strong HA 目錄 差異 class 列表 簡介 當我們進行代碼審計或校驗備份結果時,往往需要檢查原始與目標目錄的文件一致性,python的標準庫已經自帶了滿足此需求的模塊filecmp。filecmp可以實現文件、目

WIZnet晶片|W5100SW5500差異對比

W5100S、W5500、W5100差異對比         型號 引數 W5500 W5100 W5100S  內部架構 全硬體TCP / IP協議

SQLServerOracle對比

      oracle 的資料型別:number(p,s),char,varchar2,Date,LOB                注意:insert into table_name values('1','張三','男',date'2012-3-5');插入字串日期前加date轉換型別       

MySQLOracle 差異比較-基本語法

1、 查詢行數自增1 Oracle:中select rownum , a.* from fdcom a Mysql: select @ROWNO := @ROWNO + 1 as rownum , a.* from (select shortname from

MySQLOracle的語法區別詳細對比

變量 into lpad while循環 獲得 var 無符號 這樣的 ims Oracle和mysql的一些簡單命令對比 1) SQL> select to_char(sysdate,‘yyyy-mm-dd‘) from dual;   SQL> select

MySQLOracle(二)---日期對比(MySQL)

val replace nbsp rac oracl 日期 align mysql datetime MySQL與Oracle的日期函數對比(一) 一、SQL 短日期格式:yyyy-m-d SELECT REPLACE(CONVERT(varchar(10),getda

MySQLOracle(三)---日期對比Oracle

數據庫 alt to_date pan 技術分享 時間日期 軟件 floor lte Oracle: 1.獲取當前日期的年,月,日,時,分,秒 select to_char(sysdate,‘yyyy‘) as nowYear from dual; //獲取時間

PostgreSQLOracle差異分析之rownum

1. rownum是Oracle內部的一個偽列,用來表示資料在結果集中的行數。Oracle中,把檢索結果取出來後,在畫面上分頁顯示的功能,都是使用rownum,並且使用多層子查詢來實現的。 2. PostgreSQL中,沒有rownum這樣的偽列,但是提供了 limit 和 of

MySQLOracle SQL語言差異比較

Oracle與MySQL的SQL語句區別 1資料庫 /*   mysql可以建立資料庫,而oracle沒有這個操作,oracle只能建立例項;   sql資料庫操作:database   格式:   &nbs

scala 下 sigmoid breeze.numeric.sigmoid差異對比

scala> val beforeInit = System.nanoTime;val handsgn = rd.map(x => 1.0 / (1.0 + Math.exp(-x)));val cost = System.nanoTime - beforeInit; beforeInit

HBase、MongoDB、MySQL、Oracle、Redis--nosql資料庫關係資料庫對比

HBase vs. MongoDB vs. MySQL vs. Oracle vs. Redis,三大主流開源 NoSQL 資料庫的 PK 兩大主流傳統 SQL 資料庫 類別 HBase MongoDB MySQL Oracle Redis 描述 基於 Ap

關於PostgreSQLMongoDB在NoSQL方面的簡單對比

之前我們在和開發團隊所設計框架裡面的MongoDB標準組件PK時,曾經找了一些PG與MongoDB的對比材料。 今天得空又具體看了下,簡單總結一下,供大家借鑑參考: 一、先搞清楚它們支援的資料型別。 PG支援的資料型別叫JSON,從PostgreSQL 9.3版本開始,JSON已經成為內建資料型別,不僅僅

JDK的ByteBufferNetty的ByteBuf之間的差異對比

文章目錄 JDK的`ByteBuffer`與Netty的`ByteBuf`之間的差異對比: JDK的`ByteBuffer`的缺點: Netty的`ByteBuf`的優點: JDK的B

3.RxJava2.xRxJava1.x的差異對比

歡迎大家加入QQ群一起討論: 489873144(android格調小窩) RxJava2的使用步驟差異 第一步:初始化一個Observable (RxJava) (RxJava2) 第二步:初始化一個Observer (RxJava)

15.VUE學習之-v-show的使用v-if的差異對比

v-show的使用與v-if的差異對比 相同點: 都可以達到隱藏和顯示的效果. 不同點: v-show 會用display:none 來隱藏元素節點,推薦使用這種方式 v-if 會移除節點,可以配合v-else-if和v-else 使用 <!DOCTYPE html> &l

jBPM5Activiti之間的差異對比

jBPM是目前市場上主流開源工作引擎之一,在建立者Tom Baeyens離開JBoss後,jBPM的下一個版本jBPM5完全放棄了jBPM4的基礎程式碼,基於Drools Flow重頭來過,目前官網已經推出了jBPM6的beta版本;Tom Baeyens加入Alfresco

Mysql的坑--Oracle對比

之前主要使用oracle,最近幾個才開始使用mysql。發現mysql一些坑總結如下: 1. 字元比較竟然不區分大小。難以想象。。。。。 2. 表名在windows平臺不區分大小寫,在unix/