2013-06-21 53 views
0

我很想利用PostgreSQL的SQL輸出格式化我的PL/pgSQL函數裏面有,但我開始覺得我必須放棄理念。從PL/pgSQL函數中打印ASCII-art格式的SETOF記錄

我有我的PL/pgSQL函數query_result

CREATE OR REPLACE FUNCTION query_result(
    this_query text 
) RETURNS SETOF record AS 
$$ 
    BEGIN 
     RETURN QUERY EXECUTE this_query; 
    END; 
$$ LANGUAGE plpgsql; 

..merrily從輸入文本查詢,返回SETOF記錄,這我可以動態查詢使用我的SQL腳本:

mydb=# SELECT * FROM query_result('SELECT ' || :MYVAR || ' FROM Alice') AS t (id int); 
id 
---- 
    1 
    2 
    3 

所以,我的希望是找到一種方法,從獲得同樣很好地格式化輸出內一個PL/pgSQL的函數來代替,但RAISE不支持SETOF類型,並且有從SETOF記錄文本沒有神奇的預定義鑄(我知道我可以創建自己的CAST ..)

如果我創建一個虛擬print_result功能:

CREATE OR REPLACE FUNCTION print_result(
    this_query text 
) RETURNS void AS 
$$ 
    BEGIN 
     SELECT query_result(this_query);                                 
    END; 
$$ LANGUAGE plpgsql; 

。 。我無法打印格式化輸出:

mydb=# SELECT print_result('SELECT ' || :MYVAR || ' FROM Alice'); 
ERROR: set-valued function called in context that cannot accept a set 
... 

感謝您的任何建議(最好適用於PostgreSQL 8.4)。

+0

你可以發佈PL/PGSQL函數嗎?運行任意查詢並使用該語言返回一組結果應該是完全可行的,但我不清楚您遇到了哪些障礙。 –

+0

@Scott,謝謝,我用更多的細節更新了這個問題。 – Campa

回答

1

好吧,要在print_result中對結果集進行任何操作,您都必須對其進行循環。這看起來像這樣 -

這裏result_record被定義爲一個record變量。爲了便於解釋,我們還假定您有一個formatted_results變量,該變量定義爲text,默認爲空字符串以保存格式化結果。

FOR result_record IN SELECT * FROM query_result(this_query) AS t (id int) LOOP 
    -- With all this, you can do something like this 
    formatted_results := formatted_results ||','|| result_record.id; 
END LOOP; 

RETURN formatted_results; 

所以,如果你改變print_results返回文本,如我所描述聲明變量並添加此在,你的函數會返回一個逗號分隔的所有結果的列表(在一個逗號結束,我相信你可以使用PostgreSQL的string functions來修剪)。我不確定這正是你想要的,但是這應該給你一個關於如何操縱你的結果集的好主意。你可以得到更多關於控制結構的信息here,這應該讓你做任何你想做的事情。

EDIT要應答真正的問題:

格式化的數據元組爲可讀文本是PSQL客戶端,而不是PostgreSQL服務器的特徵的能力。要在服務器中使用此功能,需要從psql實用程序中提取相關的代碼或模塊,並將它們重新編譯爲數據庫函數。這似乎是可能的(也有可能有人已經這樣做了),但我對這個過程並不熟悉,不能很好地描述如何做到這一點。最有可能的是,將查詢結果格式化爲文本的最佳解決方案是利用PostgreSQL的字符串格式化函數來實現您的應用程序所需的功能。

+0

謝謝@Scott:我知道我可以手動格式化文本輸出,但我更想知道是否有一種方法可以利用標準的ASCII-art格式SQL函數來美化終端的結果調用。 – Campa

+0

啊,好吧,我想我明白你現在想要什麼。 postgres服務器不會這樣做,它只是返回數據。您正在使用的「psql」客戶端格式化所獲取的數據。你必須抓住psql工具的源代碼並找到那裏的代碼,然後將它作爲postgres服務器的函數進行編譯。可以,我確定,但我無法告訴你確切的步驟。用postgres的字符串函數來實現某些東西可能更容易,以滿足您的需求。 –

+0

我明白了..謝謝Scott。 PS您可能會在某個時候更新您的答案並提供詳細信息!我相信我會通過將函數分解爲返回'SETOF'記錄的更小的PL/pgSQL函數來進行分類,這樣我就不必應付家庭釀造的美化了。 – Campa