2017-03-07 1 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問題がおそらく他の場所にあるように問題を修正する必要があります。

しかし、重要な点の1つは、関数内に一時テーブルを作成することには、実際には不幸な意味があります(一時テーブルがロックされるためにロックの枯渇の問題に遭遇するのは簡単です)。クエリ内でそのインラインを移動するには、MUCHの方がよいでしょう。

第2に、これはあなたが考えると異なる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