Postgresql
返回表的無類型函式
我想編寫一個 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 上為此寫了一個全面的答案。