今天周四,本周完成了之前在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
以上就是我在遷移過程中遇到的不同點,希望有同學補充,謝謝。