2013-03-28 528 views
1

我正面臨Oracle到PostgreSQL的遷移:我設法轉換表和視圖,但是我有點卡住了存儲過程。將Oracle存儲過程轉換爲PostgreSQL

我已經開始與這一個,它看起來像這樣在Oracle中:

CREATE OR REPLACE procedure 
    update_role_func_def(function_id varchar2) 
as 
    cursor role_list_cursor is 
    select r.id from amm_role r 
    for update of r.id 
    ; 
begin 
    for role_record in role_list_cursor 
    loop 
    insert into AMM_ROLE_FUNC_DEF (RID, FID, GRANT_FUNCT) values (role_record.id, function_id, 'N'); 
    end loop; 

    commit; 
end update_role_func_def; 

看文檔,我設法創建此等價的:

CREATE FUNCTION 
    update_role_func_def(function_id varchar) 
    returns void 
as 
$$ 
DECLARE 
    cursor role_list_cursor is 
    select r.id from amm_role r for update of r.id ; 
begin 
    for role_record in role_list_cursor 
    loop 
    insert into AMM_ROLE_FUNC_DEF (RID, FID, GRANT_FUNCT) values (role_record.id, function_id, 'N'); 
    end loop; 

    commit; 
end ; 
$$ 

在進入但此過程PgAdmin導致「語法錯誤,意外的CREATE,期望';'

我覺得有點失落:有沒有Postgres的開發者,可以給我一個線索,如果程序在語法上是正確的

+2

不能使用'commit' Postgres裏的函數內,你不需要光標在所有的(無論是在Oracle和Postgres裏)這可以用一個'INSERT ... SE完成LECT聲明'。如果你根本沒有更新'amm_role',你爲什麼要用'update'呢? – 2013-03-28 11:47:25

+0

按照@a_horse的建議,只用'sql'(沒有'declare','begin','end'),除非在需要plpgsql的函數中有更多。聲明使用的語言'language sql'或'language plpgsql' – 2013-03-28 11:52:35

回答

3

除非有更多的這方面比你都在告訴我們,下面應該工作:

create or replace function update_role_func_def(function_id varchar) 
    returns void 
as 
$$ 
    insert into AMM_ROLE_FUNC_DEF (RID, FID, GRANT_FUNCT) 
    select r.id, function_id, 'N' 
    from amm_role r; 
$$ 
language sql; 

下面是一個SQLFiddle例子:http://sqlfiddle.com/#!12/aed49/1

+0

非常感謝您的幫助。我真的需要一個初始bootstrap :-) – 2013-03-28 13:45:29