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

1 回答 1

2

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

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

RETURNS setof record 在 9.1 中不再需要用户,使用起来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);

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

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

于 2012-04-05T18:41:19.043 回答