2017-09-01 1 views
0

Alles, was ich tun möchte, ist in der Lage, einen do Block zu verwenden, um einige Variablen festzulegen und dann eine Abfrage an STDOUT mit diesen Variablen zurückgeben.Zurückgeben einer Abfrage von einem Do-Block

DO $$ 
DECLARE book_name TEXT; 
DECLARE book_slug TEXT; 
BEGIN 
    book_name := 'Ise Monogatari'; 
    book_slug := 'ise'; 

    SELECT bk.id, 
    bk.created_at, 
    bk.updated_at, 
    bk.title, 
    bk.japanese_title, 
    bk.content, 
    bk.description, 
    'public/cjp/' || book_slug || '/images/cover.png' cover_image_path, 
    'public/cjp/' || book_slug || '/images/title.png' title_image_path, 
    'public/cjp/' || book_slug || '/images/thumb_left.png' thumbnail_path, 
    'public/cjp/' || book_slug || '/images/background.png' background_image_path, 
    bk.about, 
    bk.published 
    FROM books bk 
    WHERE bk.title = book_name; 
END $$; 

bekomme ich folgende Fehlermeldung:

[42601] ERROR: query has no destination for result data 
Hint: If you want to discard the results of a SELECT, use PERFORM instead. 
Where: PL/pgSQL function inline_code_block line 8 at SQL statement 

Jede Hilfe sehr geschätzt wird.

Antwort

1

Sie können kein Ergebnis von einem DO-Befehl zurückgeben. The documentation says (Hervorhebung hinzugefügt):

The code block is treated as though it were the body of a function with no parameters, returning void.

Sie können einen allgemeinen Tabellenausdruck verwenden:

WITH args(book_name, book_slug) AS (
    VALUES ('Ise Monogatari', 'ise') 
) 

    SELECT bk.id, 
    bk.created_at, 
    bk.updated_at, 
    bk.title, 
    bk.japanese_title, 
    bk.content, 
    bk.description, 
    'public/cjp/' || book_slug || '/images/cover.png' cover_image_path, 
    'public/cjp/' || book_slug || '/images/title.png' title_image_path, 
    'public/cjp/' || book_slug || '/images/thumb_left.png' thumbnail_path, 
    'public/cjp/' || book_slug || '/images/background.png' background_image_path, 
    bk.about, 
    bk.published 
    FROM books bk 
    CROSS JOIN args 
    WHERE bk.title = book_name; 
+0

Thank you! Wie immer hätte ich das Handbuch sorgfältiger lesen sollen. –

+0

Beim ersten Lesen weiß man nicht, wonach man suchen soll. Aber zum Glück gibt es Stackoverflow! – klin

+0

Wenn Sie ein Datum von do bloack zurückgeben möchten, können Sie auch GUC oder TEMP TABLE verwenden –

Verwandte Themen