2017-09-01 57 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也 –