2017-03-07 46 views
0

我有一個PLPGSQL功能看起來像這樣:PSQL仍然拋出「查詢沒有目的地的結果數據」,甚至有「返回查詢」

CREATE OR REPLACE FUNCTION func1(....) 
RETURNS TABLE(aa integer, bb integer, cc timestamp) 
AS $BODY$ 
BEGIN 
    CREATE TEMPRORAY TABLE tmp 
    AS SELECT .....; 

    WITH RECURSIVE x AS (
    SELECT * 
    FROM tmp 
    WHERE some stuff ...) 
    SELECT * 
    FROM tbl1 
    WHERE ....; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

它拋出時,我稱其爲select func1(1, 2, 3)

異常
ERROR: query has no destination for result data 
HINT: If you want to discard the results of a SELECT, use PERFORM instead. 

然而,插入return query進入體內並沒有幫助:

return query 
WITH RECURSIVE x AS (....) 

和錯誤保持不變。所以你的問題很可能是在其他地方

+1

爲我工作。你需要展示更多的功能,以便我們發現錯誤的位置。 –

回答

0

RETURN QUERY應該解決這個問題。

一個主要的一點是,雖然在功能創建臨時表有一些非常不幸的影響(這是很容易碰到鎖枯竭問題,是由於這樣的事實,臨時表被鎖定)。你會做很多更好地移動你的查詢內聯。

其次,沒準這可能比你想象的一個不同的SELECT聲明。 PL/PGSQL有時會拋出引用該函數結尾的錯誤,因此您需要查看整個函數以查找錯誤。因此,如果您需要,可以對代碼進行混淆,但目前我們可以做的最好的事情是說「您的錯誤可能在其他地方,請仔細檢查。」

0

顯示這個例子,它的工作原理

CREATE OR REPLACE FUNCTION test() 
    RETURNS TABLE(_id integer, _name text) AS 
$BODY$ 
BEGIN 

    return QUERY 
    with x as (select id,name from my_table) 
    select id,name from x; 

END;$BODY$ 
    LANGUAGE plpgsql STABLE