2017-09-01 56 views
0

我想要做的就是能夠使用do塊設置一些變量,然後使用這些變量將查詢返回到STDOUT返回來自do塊的查詢

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 $$; 

我得到以下錯誤:

[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 

任何幫助表示讚賞。

回答

1

您不能從DO命令返回任何結果。 The documentation says(強調):

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

可以使用公用表表達式:

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

謝謝!與往常一樣,我應該仔細閱讀手冊。 –

+0

初讀時不知道要找什麼。但幸運的是有stackoverflow! – klin

+0

如果你想從做bloack返回一些日期,你可以使用GUC或TEMP TABLE也 –