oracle pl/sql到postgres plpgsql的遷移

來源:互聯網
上載者:User

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

以上就是我在遷移過程中遇到的不同點,希望有同學補充,謝謝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.