ITPub博客

首页 > 数据库 > Oracle > oracle pl-sql到postgres plpgsql的迁移

oracle pl-sql到postgres plpgsql的迁移

Oracle 作者:wufeng00568 时间:2012-06-14 04:33:21 0 删除 编辑

今天周四,本周完成了之前在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关键字之下http://www.ahhcby.com,如以上红字所示

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函数缩水了,oracle是instr(str,str,begin index, time),postgres中只剩下前两个参数了。

8. GOTO 语句没有了,但是可以直接使用CONTINUE语句,这是个福音。

9. minus莫有了,取而代之的是except,用法和效果相同

10. 这个我最不能理解,在一个function中调用另外一个function居然要这么写:

select function_name();

饿的神啊,这是什么啊!

11.oracle中常用的获取第一条记录的rownum没有了,但是我们有了更强功能http://www.leading2008.com/的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

以上就是我在迁移过程中遇到的不同点,希望有同学补充,谢谢。

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22570603/viewspace-1117644/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-09-20