本文档主要从数据库开发角度来对比二者的区别,有一些二者相同之处,这里不再专门提出。
一、块操作对象
·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])。