これは次のように機能する可能性があります:
CREATE OR REPLACE FUNCTION tt_query(orig_name regclass, data_tt timestamp)
RETURNS SETOF record AS
$func$
BEGIN
EXECUTE 'CREATE OR REPLACE TEMP VIEW tmp as
select *
from '
|| orig_name
|| ' where trigger_changed >'
|| quote_literal(data_tt)
|| ' ORDER BY trigger_changed DESC';
-- other work on view tmp
-- return the rows of view temp
RETURN QUERY
SELECT * FROM tmp;
END
$func$ LANGUAGE plpgsql;
-
オブジェクト識別子タイプ
regclass
> SQLインジェクションを自動的に回避します。 -
古い構文
varALIAS for $ 1
を使用しないでください あなたがする必要がない場合。代わりにパラメータ名を宣言してください。 -
キーワード
temp
は使用しません それが許可されている場合でも、識別子として。tmp
の使用 代わりに。 -
RETURN QUERY
を使用します レコードのセットを返します。これは、EXECUTE
を使用しない静的な呼び出しでもかまいません。 。ただし、匿名のレコードを返しています そしてPostgresは列定義リストを要求します すべての呼び出しで:
SELECT * FROM tt_query('tbl_name', '2014-02-15 12:00')
AS f(col1 int, col2 text, ...);
これはかなり扱いにくいです。
より良いソリューション
知っている 戻りタイプ(テーブル名が変更されている場合でも、列のリストが同じタイプを共有している可能性があります)、作成時に宣言します。この関連する質問を検討してください:
PostgreSQL:エラー:42601:「レコード」を返す関数には列定義リストが必要です
返品タイプが異なる場合 提供されたテーブル名を使用しても、はるかに優れたソリューションがあります。 SELECT * FROM tbl
でビューを作成しているので 、テーブル自体のよく知られたタイプを多形
パラメータ:
CREATE OR REPLACE FUNCTION tt_query(orig_name anyelement, data_tt timestamp)
RETURNS SETOF anyelement AS
$func$
BEGIN
EXECUTE format('CREATE OR REPLACE TEMP VIEW tmp AS
SELECT * FROM %s
WHERE trigger_changed > %L
ORDER BY trigger_changed DESC'
,pg_typeof(orig_name)
,data_tt);
-- other work on view tmp
-- return the rows of view tmp
RETURN QUERY
SELECT * FROM tmp;
END
$func$ LANGUAGE plpgsql;
簡略化された呼び出し:
SELECT * FROM tt_query(NULL::tbl_name, '2014-02-15 12:00');
format()<も使用します/ code>
安全でシンプルな文字列連結のために。
この関連する回答の詳細:
PL / pgSQL関数をリファクタリングして、さまざまなSELECTクエリの出力を返します