oracle pl/sql到postgres plpgsql的迁移

来源:互联网 发布:php企业建站源码 编辑:程序博客网 时间:2024/06/04 18:15

    今天周四,本周完成了之前在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

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


原创粉丝点击