2017-09-01 4 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

do bloackから日付を返す場合は、GUCまたはTEMP TABLEを使用することもできます –

関連する問題