4

plpgsql 関数から動的に生成された select ステートメントを返す必要があります。これは私がこれまでに持っているものです:

CREATE OR REPLACE FUNCTION qa_scf(cname character varying, tname character varying)
RETURNS text AS
$BODY$
BEGIN
return '* from ' ||tname|| 'where ' ||cname ||' != ''AL''';
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

呼び出し元は、バッチ ファイルから実行されました。

select qa_scf('state', 'testtable')

これは、リテラル テキスト "qa_scf * from testtable where state != 'AL'" を返します。このクエリを SQL バッチ ファイルから実行する必要がありますが、この関数に文字列を返してから SQL バッチで実行させるための正しい return ステートメントが見つからないようです。Postgres 9.0 を使用しています。

4

1 に答える 1

10

戻り型は SETOF RECORD である必要があります。SQL を実行して返すと、RETURN QUERY EXECUTE になります。クエリに SELECT がありません。また、where の前に空白がありませんでした。

CREATE OR REPLACE FUNCTION qa_scf(cname character varying, tname character varying)
RETURNS SETOF RECORD AS
$BODY$
BEGIN
    RETURN QUERY EXECUTE 'SELECT * from ' ||tname|| ' where ' ||cname ||' != ''AL''';
END;
$BODY$
LANGUAGE plpgsql;

結果で期待する列を指定する必要があるため、この関数の呼び出しは少し複雑になります。次のようになります。

SELECT *
FROM qa_scf('foo', 'bar') AS t(col1_name col1_type, ...);
于 2012-05-23T16:05:47.480 に答える