2016-08-25 2 views
0

Ich habe eine gespeicherte Prozedur:PostgreSQL gespeicherte Prozedur Fehler

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; 

Compile erfolgreich, aber wenn ich laufen

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

Bitte helfen Sie mir zu beheben. Danke vielmals.

+0

[RETURN NEXT und RETURN QUERY] (https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#AEN62624) – Abelisto

Antwort

0

Bei Funktion müssen wir Werte zurückgeben

wenn wir Sie Funktion wie folgt schreiben können wir

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; 

auf die Ausführung dieser Funktion die gewünschten Ergebnisse erhalten, werden Sie einen Cursor erhalten. Um Werte aus dem Cursor abzurufen, geben Sie eine Abfrage ein.

SELECT postalcode_lookup(--ccode); 

fetch all "<unnamed portal 1>"; 

Ich hoffe, es hilft.

+0

Rückkehr ein Cursor funktionieren könnte, ist aber viel komplizierter zu arbeitet mit dann einer einfachen 'Rückkehr Abfrage ...' –

+0

ich erstellen, wie Sie oben descibed aber Fehler Fehler: Syntaxfehler bei oder in der Nähe von „Open“ LINE 16: Open cur_postalcode für ^ ******** ** Fehler ********** Fehler: Syntaxfehler bei oder in der Nähe von "Open" SQL-Status: 42601 Zeichen: 412 – anhdv

+0

die Ergebnismenge ist sehr seltsam. Wie auch immer, vielen Dank für Ihre Hilfe. – anhdv

-1

Wie Sie keine prozeduralen Code haben, verwenden Sie eine einfache SQL-Funktion:

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; 

Für Vollständigkeit, die PL/pgSQL-Version dieser müssten RETURN QUERY verwenden:

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; 

Aber die einfache SQL-Funktion sollte bevorzugt werden, da sie schneller ist (und besser optimiert werden kann, wenn sie in einer komplexeren Anweisung verwendet wird, z. B. mit einem Join oder mit zusätzlichen where Bedingungen.

In beiden Fällen kann die Funktion wie eine Tabelle verwenden werden:

select * 
from postalcode_lookup('ABCDEF'); 

Unrelated, aber: mit den character Typdaten ist fast immer eine schlechte Wahl. Verwenden Sie stattdessen varchar oder text.

+0

Vielen Dank. Es läuft gut. – anhdv

+0

@anhdv: Wenn dies Ihr Problem gelöst hat, akzeptieren Sie die Antwort, damit Ihre Frage als gelöst markiert wird –

Verwandte Themen