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 之後!
擴充套件閱讀
相關推薦
PostgreSQL與Oracle的差異對比
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默認是
PostgreSQL與Oracle對應的函數
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晶片|W5100S與W5500差異對比
W5100S、W5500、W5100差異對比 型號 引數 W5500 W5100 W5100S 內部架構 全硬體TCP / IP協議
SQLServer與Oracle的對比
oracle 的資料型別:number(p,s),char,varchar2,Date,LOB 注意:insert into table_name values('1','張三','男',date'2012-3-5');插入字串日期前加date轉換型別
MySQL與Oracle 差異比較-基本語法
1、 查詢行數自增1 Oracle:中select rownum , a.* from fdcom a Mysql: select @ROWNO := @ROWNO + 1 as rownum , a.* from (select shortname from
MySQL與Oracle的語法區別詳細對比
變量 into lpad while循環 獲得 var 無符號 這樣的 ims Oracle和mysql的一些簡單命令對比 1) SQL> select to_char(sysdate,‘yyyy-mm-dd‘) from dual; SQL> select
MySQL與Oracle(二)---日期對比(MySQL)
val replace nbsp rac oracl 日期 align mysql datetime MySQL與Oracle的日期函數對比(一) 一、SQL 短日期格式:yyyy-m-d SELECT REPLACE(CONVERT(varchar(10),getda
MySQL與Oracle(三)---日期對比(Oracle)
數據庫 alt to_date pan 技術分享 時間日期 軟件 floor lte Oracle: 1.獲取當前日期的年,月,日,時,分,秒 select to_char(sysdate,‘yyyy‘) as nowYear from dual; //獲取時間
PostgreSQL和Oracle的差異分析之rownum
1. rownum是Oracle內部的一個偽列,用來表示資料在結果集中的行數。Oracle中,把檢索結果取出來後,在畫面上分頁顯示的功能,都是使用rownum,並且使用多層子查詢來實現的。 2. PostgreSQL中,沒有rownum這樣的偽列,但是提供了 limit 和 of
MySQL與Oracle 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
關於PostgreSQL與MongoDB在NoSQL方面的簡單對比
之前我們在和開發團隊所設計框架裡面的MongoDB標準組件PK時,曾經找了一些PG與MongoDB的對比材料。 今天得空又具體看了下,簡單總結一下,供大家借鑑參考: 一、先搞清楚它們支援的資料型別。 PG支援的資料型別叫JSON,從PostgreSQL 9.3版本開始,JSON已經成為內建資料型別,不僅僅
JDK的ByteBuffer與Netty的ByteBuf之間的差異對比
文章目錄 JDK的`ByteBuffer`與Netty的`ByteBuf`之間的差異對比: JDK的`ByteBuffer`的缺點: Netty的`ByteBuf`的優點: JDK的B
3.RxJava2.x與RxJava1.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
jBPM5與Activiti之間的差異對比
jBPM是目前市場上主流開源工作引擎之一,在建立者Tom Baeyens離開JBoss後,jBPM的下一個版本jBPM5完全放棄了jBPM4的基礎程式碼,基於Drools Flow重頭來過,目前官網已經推出了jBPM6的beta版本;Tom Baeyens加入Alfresco
Mysql的坑--與Oracle對比
之前主要使用oracle,最近幾個才開始使用mysql。發現mysql一些坑總結如下: 1. 字元比較竟然不區分大小。難以想象。。。。。 2. 表名在windows平臺不區分大小寫,在unix/