Postgresql
如何創建返回一組表的函式(table_name)
我有一組共享相同欄位的表(一些時間戳和用於版本控制的使用者名)。我需要使用動態 sql 創建一個函式,該函式使用 table_name 和時間戳作為參數並返回一組相同的表。
我需要的查詢有點複雜,但對於我的問題,以下範例應該足夠了。
這就是我嘗試創建函式的方式:
CREATE OR REPLACE FUNCTION "vsr_versioning_at_time"(_t regclass , _d timestamp without time zone) RETURNS SETOF _t AS $$ BEGIN EXECUTE 'SELECT DISTINCT ON (gid) * FROM '|| _t || 'WHERE vrs_start_time <= '|| _d || 'ORDER BY gid, vrs_start_time DESC'; END $$ LANGUAGE plpgsql;
此函式的創建失敗,
_t
因為RETURN SETOF _t
.
您不能使用參數名稱 (
_t
) 作為返回類型。改用多態類型:
CREATE OR REPLACE FUNCTION vsr_versioning_at_time(_t anyelement, _d timestamp) RETURNS SETOF anyelement AS $func$ BEGIN RETURN QUERY EXECUTE format(' SELECT DISTINCT ON (gid) * FROM %s WHERE vrs_start_time <= $1 ORDER BY gid, vrs_start_time DESC' , pg_typeof(_t) ) USING _d; END $func$ LANGUAGE plpgsql;
並用於
RETURN QUERY EXECUTE
實際返回結果。致電(重要!):
SELECT * FROM vsr_versioning_at_time(NULL::mytable, '2014-04-18 12:00');
更多關於 SO(最後一章)的相關答案的詳細資訊: