2014-02-06 93 views
1

我試圖將動態查詢結果轉換爲json,然後返回該json作爲此函數的結果(這是一個簡化版本,我的實際代碼中的WHERE子句是相當長的時間)。將動態查詢的結果轉換爲json

CREATE OR REPLACE FUNCTION get_data_as_json(tbl regclass, p_version_id integer) 
    RETURNS json AS $$ 
BEGIN 
    RETURN to_json(EXECUTE 'SELECT * FROM '|| tbl 
         || ' WHERE version_id = p_budget_version_id'); 
END; 
$$ LANGUAGE plpgsql; 

但是,此代碼導致type "execute" does not exist錯誤。
如何運行動態查詢,然後將結果轉換爲JSON?

+0

檢查http://hashrocket.com/blog/posts/faster-json-generation-with-postgresql - 不是「選擇array_to_json(ARRAY_AGG(row_to_json(T )))「例子你在找什麼? – Leo

+0

這並不考慮問題的動態部分(但「array_to_json(array_agg(row_to_json)」可能有幫助。謝謝!) – RodeoClown

+0

爲動態部分,你不必使用返回查詢嗎?請參閱http:///stackoverflow.com/questions/7945932/how-return-result-of-a-select-inside-a-function-in-postgresql – Leo

回答

3

如果您返回SETOF您需要使用RETURN QUERY EXECUTE構造,產生一個動態查詢,返回所需內容。由於你不是,請使用常規的EXECUTE ... INTO變量,然後返回。

未經檢驗的,但依稀正確的方向:

CREATE OR REPLACE FUNCTION get_data_as_json(tbl regclass, p_version_id integer) RETURNS json AS $$ 
DECLARE 
    my_result json; 
BEGIN 
    EXECUTE format('SELECT to_json(*) FROM %I WHERE version_id = p_budget_version_id',tbl) INTO my_result; 
    RETURN my_result; 
END; 
$$ LANGUAGE plpgsql; 
+0

不幸的是,返回錯誤「錯誤:不能在非SETOF函數中使用RETURN QUERY」(我曾嘗試過類似的方法) – RodeoClown

+0

@RodeoClown嘗試修改版本 –

+0

Thanks Craig。它仍然不喜歡'RETURN QUERY'位,因爲它返回的是JSON,而不是SETOF XXX – RodeoClown

3

什麼@Craig wrote。但結構稍有不同的解決方案與其他修復:

CREATE OR REPLACE FUNCTION get_data_as_json(tbl regclass 
              , p_version_id integer 
              , OUT my_result json) AS 
$func$ 
BEGIN 
    EXECUTE format('SELECT to_json(*) FROM %s 
        WHERE version_id = $1' 
        ,tbl) 
    INTO my_result 
    USING p_version_id; 
END 
$func$ LANGUAGE plpgsql; 
+0

是的,那裏肯定有一個錯字。謝謝。 – RodeoClown