Postgresql

返回表的無類型函式

  • January 19, 2018

我想編寫一個 PostgreSQL 儲存函式,它的行為本質上類似於我在 MSSQL 和 MySQL 中所知道和喜愛的儲存過程,我可以只包裝一個不帶參數的查詢並讓它返回該結果集,而無需指定輸出的格式並在每次更新查詢時更改該定義。這在 PostgreSQL 中是否可行?

我使用 PostgreSQL 9.2 嘗試了以下操作:

CREATE OR REPLACE FUNCTION test()
RETURNS SETOF record

這給了我以下錯誤:

錯誤:返回“記錄”的函式需要列定義列表

我也試過:

CREATE OR REPLACE FUNCTION test()
RETURNS table ()

但顯然這是無效的語法。

這是一種誤解。像這樣的函式是完全有效的:

CREATE OR REPLACE FUNCTION test()
RETURNS SETOF record AS
$func$
VALUES (1, 2), (3, 4);  -- 2 rows with 2 integer columns
$func$ LANGUAGE sql;

但是,由於它返回匿名記錄,因此您需要在每次呼叫時提供列定義列表,就像錯誤消息告訴您的那樣。SQL 要求預先知道函式的期望。呼叫將像這樣工作:

SELECT * FROM test() **AS f(a int, b int);**

返回匿名記錄的函式有其用途。我盡量避免使用它們,因為呼叫相當笨拙。根據您的確切要求,有幾種方法可以解決它。我最近在 SO 上為此寫了一個全面的答案。

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