0

私はpostgresqlを学んでいて、2つの結合されたテーブルから選択を返すはずのこのようなストアドプロシージャに長い選択を入れることができるかどうか疑問に思っていました:

CREATE OR REPLACE FUNCTION api.book_list()
RETURNS TABLE (
  id         BIGINT,
  published  DATE,
  category   VARCHAR,
  author     VARCHAR,
  name       VARCHAR
) AS $$
BEGIN
  SELECT
    b.id,
    b.published,
    c.name AS category,
    b.author,
    b.name
  FROM
    schemas.book AS b
  JOIN
    schemas.category AS c
  ON
    c.id = b.category_id;
END;
$$
LANGUAGE plpgsql;

エラーが発生します:

select * from api.book_list();
ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function "book_list" line 3 at SQL statement
4

2 に答える 2

2

このような単純なクエリでは、VIEWまたはSQL関数を使用します。

CREATE OR REPLACE FUNCTION api.book_list()
RETURNS TABLE (
  id         bigint,
  published  date,
  category   varchar,
  author     varchar,
  name       varchar) AS
$func$
  SELECT b.id
        ,b.published
        ,c.name -- AS category -- alias irrelevant and conflicts with OUT param
        ,b.author
        ,b.name
  FROM   schemas.book b
  JOIN   schemas.category c ON c.id = b.category_id
$func$
LANGUAGE sql;

そうすれば、、またはと同じようにRETURN QUERY、は必要ありません。BEGINENDplpgsql

于 2012-12-31T19:27:28.873 に答える
1

試す:

BEGIN
  return query
  SELECT
    b.id,
    b.published,
    c.name AS category,
    b.author,
    b.name
  FROM
    schemas.book AS b
  JOIN
    schemas.category AS c
  ON
    c.id = b.category_id;
END;
于 2012-12-31T18:59:35.423 に答える