2012-02-06 109 views
5

的arbirary數的函數。SELECT FROM返回一個紀錄,我使用PostgreSQL數據庫列

我有我的plpgsql FUNCTION,返回一個單一的record與任意數量的列。
由於這種隨意性,我需要使用類似:

SELECT * FROM my_function(97) 

但這無法正常工作的Postgres給了我以下錯誤:

a column definition list is required for functions returning "record"

但是,如果我做的:

SELECT my_function(97) 

我可以看到預期的結果,但封裝在一個列中。

有沒有一種方法,以獲取預期的結果爲一組列如預期由功能而不是一個單一柱包覆所有的人?

回答

0

爲了返回一個「列」,你將有一個定義返回類型爲TABLESETOF在這種情況下,你實際上返回的,你應該能夠從SELECT記錄一組。

有關返回SETOF功能的更多信息,看看this link to documentation

+1

的問題是,表需要一個固定的一組列,無論如何,這樣,纔不會無論如何解決這個問題,我的問題是如何從不能與任意數量的返回一個記錄的函數取列,讓我們說一次返回一個記錄與3列,另一個時間記錄與2列。 – 2012-02-06 18:13:20

+2

@ flash.tato在這種情況下,如果你不知道你的輸出可能是什麼樣的,你會如何選擇任何東西? – Karlson 2012-02-06 18:21:08

+0

我認爲引擎應該檢查RECORD並獲取字段 – 2012-02-06 18:56:32

2

您有幾種選擇在這裏:

  1. 返回一個指針,並從應用程序的遊標提取。請注意,如果您需要返回多個結果集,您實際上可以返回多個REFCURSORS。

  2. 返回的XML文檔和應用程序解析它。

  3. 使用一堆OUT變量,返回記錄,並確定選擇哪個這些從

最根本的問題是,實際返回的結果需要在規劃時間,所以你要知道不能只返回任意數量的列。計劃者需要知道將要返回的內容。

5

當一個函數只是RETURNS recordSETOF record(沒有OUT參數隨它去),PostgreSQL並不知道名稱和類型的元素,你需要提供一個字段定義列表與每一個電話。

避免使用如果可能的話,並返回一個衆所周知類型代替。除了workarounds @Chris provided之外,還有其他幾種聲明返回類型的方法。我最近寫了一篇全面的相關答案:

有SO上已經有不少相關的問題。我記得回答了一大堆。
Try a search!

1

當使用一組在選擇列表中返回函數(SETOF)上的從左手側,該函數返回一個composite type。使用表格作爲函數的輸入時,在選擇列表中使用函數可能很難避免。

從複合類型的單個列的選擇項目的一種方式如下:

SELECT 
    (my_function).field1, 
    (my_function).field2, 
    (my_function).field3 
FROM 
(SELECT my_function(*) 
FROM sometable) t 
-1

我不能肯定,我跟着你以後,但工作的呢?

SELECT (my_function(97)).my_column 
相關問題