ORACLE與PostgreSql的區別


http://blog.itpub.net/post/2316/10994

ORACLE與PostgreSql的區別

本文檔主要從數據庫開發角度來對比二者的區別,有一些二者相同之處,這里不再專門提出。


一、塊操作對象

 

·oracle有存儲過程、函數、包、等塊操作對象,各功能有所不同。

 

最常用的是存儲過程和函數,過程沒有返回值,並可以自由定義傳入/出參數;函數必須且只能返回一個參數結果。

 

oracle還可以定義臨時塊,使用以下的格式

 

  DECLARE

 

  [參數說明]

 

  BEGIN

 

   操作內容;

 

  END;

 

  /

 

·postgres里只有函數,沒有存儲過程,所有的塊操作都必須通過函數來完成。即使沒有必須有返回值的函數(對應在oracle的存儲過程),一般都用

 

  RETURN88;

 

這樣的方法來實現。

 

postgres的函數需要用引號’’把正文(從DECLARE到最后一個END之間的內容)引起來。這樣的話,正文中原有的引號都需要使用引號()或者反斜線()來轉義。也可以用“$BODY$”來引用正文,這樣可以不必轉義正文中的引號。

 

postgres的函數,在正文之后需要加上

 

LANGUAGE 'plpgsql' VOLATILE;

 

postgres的觸發器也需要由函數來實現。

 

 

 

二、觸發器

 

·oracle的觸發器,使用

 

CREATE [OR REPLACE]TRIGGER 觸發器名觸發器定義

 

BEGIN

 

  觸發器操作內容;

 

END;

 

/

 

·postgres的觸發器,需要通過函數來實現,之前需要通過專門的定義。

 

 

 

三、參數

 

·oracle函數(存儲過程同,本節不另說明)的參數名,直接寫在函數的聲明中,如

 

CREATE [OR REPLACE]FUNCTION 函數名 (p_int_id NUMBER) AS……

 

在程序中可以直接引用參數名稱進行操作,如:

 

SELECT user_label INTO v_label FROM iptca_objects WHERE int_id= p_int_id;

 

·postgres函數,在函數聲明中只寫對應的數據類型,而不寫明參數的名稱,然后在程序體DECLARE后定義變量指向參數。示例:

 

CREATE [OR REPLACE]FUNCTION 函數名(int8) AS ……

 

DECLARE

 

  p_int_id aliasFOR $1;

 

BEGIN

 

END;

 

/

 

當沒有輸入參數時,postgres函數名后面也要有一個“()

 

 

 

四、例外處理

 

·在oracle里,有豐富的例外事件,可以在程序中截獲並進行相應的處理,同時還可以自定義例外事件。

 

·postgres里沒有例外處理,一旦程序運行過程中,出現了錯誤,程序將直接中斷退出,並打出錯誤的信息。之前已經完成的操作不提交。

 

 

 

五、空字符串

 

 例: v_tmp2 :=v_tmp1||’0’;

 

·在oracle中,對字符串變量,不需要專門給它賦空值,這樣與其它的字符串連接時不會有問題,如上例子,v_tmp1v_tmp2在定義后都沒有賦過值(或為null),經過該語句后,v_tmp1還是空串,v_tmp2的值是’0’

 

·在postgres里,字符串如果要與別的字符串進行連接,則必須先賦值。如上例子,v_tmp1v_tmp2在定義后都沒有賦過值(或為null),經過該語句后,v_tmp1v_tmp2都會是空串;而在該語句給v_tmp1賦值:

 

  v_tmp1 :=‘’;

 

再執行例子的語句,v_tmp2的值是’0’

 

 

 

六、substr函數

 

  substr(org_string,begin_position[,sub_length])

 

·ORACLE里,begin_position可以是負數,表示的是從字符串的右邊開始取值。

 

·postgres里,對負數處理沒有說明,暫時找不到規律。如果需要從字符串的右邊開始取值,需要先算出字符串的長度length,再用substr(org_string,length-sub_length[,sub_length])

lykity 發表於:2004.12.21 13:17 ::分類:(  技術討論 )::閱讀:(4906次) ::  評論 (0)
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM