2016-08-25 5 views
0

私は、ストアドプロシージャ持つストアド:PostgreSQLは手順エラー

CREATE OR REPLACE FUNCTION postalcode_lookup(ccode character(6)) 
RETURNS SETOF postalcode AS $BODY$ 
BEGIN 
    WITH RECURSIVE tblParent AS 
    (
     SELECT * 
     FROM postalcode 
     WHERE postalcode.code = ccode 

     UNION ALL 

     SELECT postalcode.* 
     FROM postalcode 
     JOIN tblParent ON postalcode.code = tblParent.parent 
    ) 
    SELECT * FROM tblParent; 

END;$BODY$ LANGUAGE plpgsql; 

コンパイルに成功したが実行しているとき、私は私が修正する助けてください

error: query has no destination for result data;SQL state: 42601;

Hint:> If you want to discard the results of a SELECT, use PERFORM instead. Context: PL/pgSQL function postalcode_lookup(character) line 3 at SQL statement

を持っています。どうもありがとう。関数の場合は

+0

[戻る次へと返り値](https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#AEN62624) – Abelisto

答えて

0

我々はあなたが我々はこの機能を実行する上で望ましい結果

CREATE OR REPLACE FUNCTION postalcode_lookup(ccode character(6)) 
    RETURNS refcursor AS $BODY$ 
    DECLARE 
    cur_postalcode refcursor; 
    BEGIN 
Open cur_postalcode for 
     WITH RECURSIVE tblParent AS 
     (
      SELECT * 
      FROM postalcode 
      WHERE postalcode.code = ccode 

      UNION ALL 

      SELECT postalcode.* 
      FROM postalcode 
      JOIN tblParent ON postalcode.code = tblParent.parent 
     ) 
     SELECT * FROM tblParent; 
    return cur_postalcode; 

    END;$BODY$ LANGUAGE plpgsql; 

を得ることができ、次のように関数を記述する場合は、カーソルを取得する値に

を返却する必要があります。指定されたクエリを実行するカーソルから値を取得します。

SELECT postalcode_lookup(--ccode); 

fetch all "<unnamed portal 1>"; 

希望します。

CREATE OR REPLACE FUNCTION postalcode_lookup(ccode character(6)) 
    RETURNS SETOF postalcode AS 
$BODY$ 
    WITH RECURSIVE tblParent AS 
    (
     SELECT * 
     FROM postalcode 
     WHERE postalcode.code = ccode 

     UNION ALL 

     SELECT postalcode.* 
     FROM postalcode 
     JOIN tblParent ON postalcode.code = tblParent.parent 
    ) 
    SELECT * 
    FROM tblParent; 
$BODY$ LANGUAGE sql; 

は完全を期すため、本のPL/pgSQLのバージョンがRETURN QUERYを使用する必要があります:

CREATE OR REPLACE FUNCTION postalcode_lookup(ccode character(6)) 
    RETURNS SETOF postalcode AS 
$BODY$ 
BEGIN 
    RETURN QUERY --<< this does the magic 
    WITH RECURSIVE tblParent AS 
    (
     SELECT * 
     FROM postalcode 
     WHERE postalcode.code = ccode 

     UNION ALL 

     SELECT postalcode.* 
     FROM postalcode 
     JOIN tblParent ON postalcode.code = tblParent.parent 
    ) 
    SELECT * 
    FROM tblParent; 
END; 
$BODY$ LANGUAGE plpgsql; 

あなたはどんな手続き型コードを持っていないとして

+0

カーソルを戻すと動作する可能性がありますが、はるかに複雑です'...その後、簡単な'リターンクエリを使用すると、上記で説明されたように私が作成した –

+0

を動作しますが、エラーのエラーを取得:構文エラーがでたり近くに「オープン」 LINE 16: ^ ********のためのオープンcur_postalcode **エラー********** エラー:「開く」またはその近くの構文エラー SQLの状態:42601 文字:412 – anhdv

+0

結果セットは非常に奇妙です。とにかく、ありがとうございました。 – anhdv

-1

は、プレーンなSQL関数を使用しますしかし、単純なSQL関数は、より速くなるため、優先されるべきです(より複雑なステートメントで使用する場合、たとえば結合または追加のwhere条件でよりうまく最適化できます)

関数はテーブルのように使用することができ、両方のケースで

select * 
from postalcode_lookup('ABCDEF'); 

関連のない、しかし:characterデータ型を使用することはほとんど常に悪い選択です。代わりにvarcharまたはtextを使用してください。

+0

ありがとうございました。それはうまくいく。 – anhdv

+0

@anhdv:これで問題が解決した場合は、回答を受け入れて、あなたの質問が解決済みとマークされるようにします –