今天周四,本周完成了之前在oracle中编写的pl/sql代码到postgres的plpgsql的迁移。
开始说点题外话,postgres这个数据库通过一周的了解,大概觉得很糙。总结下原因:1.过去近三年除了oracle几乎没用过别的数据库,看惯了气质雍容的举止得体的名门闺秀,忽然见到个寒门姑娘总觉得不成熟。2.postgres没有一个成熟的IDE工具。我是偏向数据库编程的,用惯了toad和oracle developper这种很成熟的IDE,初接触postgres便拼命想找一个能同她们媲美的工具,但是不管是官方自带的pgadmin还是navicat都让我用的想死,后来好不容易找到一个最近免费的dreamCoder用着还是想死!没办法谁让人家是开源的,没有免费又好吃的午餐。
言归正传,pl/sql 和plpgsql都是标准的sql再加上些控制语句制成的语言,语法大多相同,我只在以下列举在迁移过程中发现的不同点:
1. varchar2 --> varchar(varchar2是oracle自己定义的数据格式,脱胎与varchar这个标准sql定义的数据格式)
2.在postgres中没有procedure了,只有function,并且有一套令人蛋疼的定义方式:($BODY$这是什么玩意?)
create or replace function function_name()
returns void as $BODY$
declare
v_parament int;
begin
end;
$BODY$ language plpgsql;
3.变量的定义必须在declare关键字之下,如以上红字所示
4.游标的方式改变了,不存在游标变量了。以前oracle定义在游标变量中的select语句需要直接写在for的后面如下:
for v_cursor_parament in select .......
loop
end loop;
标红色的那个变量也必须要声明了为:v_cursor_parament record;
5. 同oracle一样有行变量 ROWTYPE, 但是如果用ROWTYPE进行insert操作就必须写成下面这样:
insert into table_name values (rowtype_parament.*)
6. oracle做表连接的操作符(+)木有了,用标准sql的left(right) outer join吧
7. 没有instr函数了,需要的可以自己实现。
8. GOTO 语句没有了,但是可以直接使用CONTINUE语句,这是个福音。
9. minus莫有了,取而代之的是except,用法和效果相同
10. 这个我最不能理解,在一个function中调用另外一个function居然要这么写:
select function_name();
饿的神啊,这是什么啊!
11.oracle中常用的获取第一条记录的rownum没有了,但是我们有了更强功能的limit...offset
12.NVL()没有了,同样功能的是COALESCT()
13.异常捕获:postgres也拥有丰富的异常定义,捕获的方式和oracle基本类似:
begin
exception when condition
then operate
end;
但是,没有一帆风顺的事情,总要出点岔子,postgres不将它认为是warning的exception跑出,其中就有在oracle中大量应用的EXCEPTION: NO_DATA_FOUND
如果想强制让postgres跑出此错,那么需要这么干: select into strict ...
14. oracle中的to_char() 没有了,同名的函数比较奇怪
15. dual没有了,不过在postgres中也不需要dual
以上就是我在迁移过程中遇到的不同点,希望有同学补充,谢谢。