首页 文章

在PostgreSQL 9.1中编写过程

提问于
浏览
1

我试图在Postgres 9.1中编写一个过程(函数)来从视图中选择所有数据并返回它(所有列),以便我们的应用程序可以使用它 . 目的是让应用程序在需要数据时调用该过程 . 我的问题是我似乎无法使语法正确返回任何数据 . 我已经在MySQL,SQL Server和Oracle中编写了程序,但从未在postgres中编写过程,这是完全不同的 . 一旦它工作是最好的方式来调用它只是使用选择“功能名称”?任何帮助,将不胜感激 .

CREATE OR REPLACE FUNCTION fg.get_flight_times()
RETURNS setof record AS
$BODY$
declare times record;
begin
select * into times from fg.fn_dy_dest_dep_arr;
return;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION fg.get_flight_times()
OWNER TO jason;
GRANT EXECUTE ON FUNCTION fg.get_flight_times() TO fltrakr;

1 回答

  • 2

    在PL / pgSQL函数内部,您需要使用RETURN NEXT或RETURN QUERY,如手册中所述:

    http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#AEN54092

    在9.1中不再需要用户 RETURNS setof record ,使用 returns table 要容易得多 . 如果您只想返回SELECT语句的结果,也可以使用SQL,这使得函数更容易:

    CREATE OR REPLACE FUNCTION fg.get_flight_times()
        RETURNS table (col1 integer, col2 text, col3 text)
    $BODY$
       select col1, col2, col3 from fg.fn_dy_dest_dep_arr;
    $BODY$
    LANGUAGE sql
    VOLATILE
    COST 100;
    

    请注意,在这种情况下,您必须在创建时指定函数返回的列定义 . 使用该版本,您只需使用:

    select * from fg.get_flight_times();
    

    当使用 returns setof record 时,你不需要在创建时指定列,但是从函数中选择时你将被迫这样做(我发现它更复杂,因为这需要在每次使用函数时完成):

    CREATE OR REPLACE FUNCTION fg.get_flight_times()
        RETURNS setof record
    $BODY$
       select * from fg.fn_dy_dest_dep_arr;
    $BODY$
    LANGUAGE sql
    VOLATILE
    COST 100;
    

    这是这样使用的:

    select *
    from fg.get_flight_times() f(col1 integer, col2 text, col3 text);
    

    在我看来更复杂(因为调用者需要知道列的结构 and 数据类型)

    请阅读手册,我在这里写的所有内容也都记录在那里(我知道这只是因为我已经阅读了手册...)

相关问题