Postgresql

如何創建返回一組表的函式(table_name)

  • April 19, 2014

我有一組共享相同欄位的表(一些時間戳和用於版本控制的使用者名)。我需要使用動態 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(最後一章)的相關答案的詳細資訊:

重構 PL/pgSQL 函式以返回各種 SELECT 查詢的輸出

引用自:https://dba.stackexchange.com/questions/63477