2013-03-28 116 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