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 に答える