本文檔主要從數據庫開發角度來對比二者的區別,有一些二者相同之處,這里不再專門提出。
一、塊操作對象
·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_tmp1和v_tmp2在定義后都沒有賦過值(或為null),經過該語句后,v_tmp1還是空串,v_tmp2的值是’0’。
·在postgres里,字符串如果要與別的字符串進行連接,則必須先賦值。如上例子,v_tmp1和v_tmp2在定義后都沒有賦過值(或為null),經過該語句后,v_tmp1和v_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])。