2014-06-14 62 views
1

我知道了,我可以用row_to_json返回JSON輸出的Postgres從函數返回JSON

例如 如果我的查詢是:

select * from sample; 

如下返回JSON,我可以把它改寫輸出:

select row_to_json(sample) from sample; 

但我試圖實現的一件事是功能相同的功能。

給你舉一個例子,這裏是函數返回表:

CREATE FUNCTION find_val(val text) 
RETURNS SETOF sample AS 
$$ 
BEGIN 
RETURN QUERY 
SELECT * FROM sample where $1 = ANY(col4); 
END; 
$$ 
LANGUAGE 'plpgsql'; 

現在,而不是行,我想從我的函數返回JSON輸出。我怎樣才能做到這一點 ?

這裏是我到目前爲止已經試過:

native=> CREATE FUNCTION find_val(val text) 
RETURNS SETOF sample AS 
$$ 
BEGIN 
RETURN QUERY 
SELECT row_to_json(sample) FROM sample where $1 = ANY(col4) ; 
END; 
$$ 
LANGUAGE 'plpgsql'; 
CREATE FUNCTION 
native=> select find_val('yo'); 
ERROR: structure of query does not match function result type 
DETAIL: Returned type json does not match expected type integer in column 1. 
CONTEXT: PL/pgSQL function find_val(text) line 3 at RETURN QUERY 
native=> drop function find_val(text); 
DROP FUNCTION 



native=> CREATE FUNCTION find_val(val text) 
native-> RETURNS json AS 
native-> $$ 
native$> BEGIN 
native$> SELECT row_to_json(sample) FROM sample where $1 = ANY(col4); 
native$> END; 
native$> $$ 
native-> LANGUAGE 'plpgsql'; 
CREATE FUNCTION 
native=> select find_val('yo'); 
ERROR: query has no destination for result data 
HINT: If you want to discard the results of a SELECT, use PERFORM instead. 
CONTEXT: PL/pgSQL function find_val(text) line 3 at SQL statement 
native=> 

回答

7

這是無關的JSON VS其他的返回類型。您不能在PL/PgSQL函數中使用普通的SELECT,它必須是SELECT INTORETURN QUERY SELECTPERFORM。根據HINT錯誤。

在你的情況下,你只需要一個普通的SQL函數。

CREATE FUNCTION find_val(val text) 
RETURNS json AS 
$$ 
SELECT row_to_json(sample) FROM sample where $1 = ANY(col4); 
$$ LANGUAGE sql; 
+3

感謝克雷格..這工作。 我需要在我的實際功能中執行一些更多的操作,所以只使用plpgsql。從官方文檔中找到正確的方法 'CREATE OR REPLACE FUNCTION find_val(val text) RETURNS json AS $$ DECLARE t_row sample%ROWTYPE; BEGIN SELECT * INTO t_row FROM sample其中$ 1 = ANY(col4); RETURN row_to_json(t_row); END; $$ LANGUAGE'plpgsql';' –