在PostgreSQL 9.1中编写过程

时间:2012-04-05 18:17:18

标签: sql postgresql-9.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 个答案:

答案 0 :(得分: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时,您不需要在创建时指定列,但在从函数中选择时您将被强制执行此操作(我发现这更复杂,因为这需要完成< em>每次使用该函数):

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);

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

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