возвращение результата запроса из динамического запроса - PullRequest
0 голосов
/ 10 мая 2018

читая о том, как сделать SP, который возвращает результаты запроса, кажется, что я должен делать такие вещи (с учебного сайта)

CREATE OR REPLACE FUNCTION show_cities() RETURNS refcursor AS $$
    DECLARE
      ref refcursor;                                                     -- Declare a cursor variable
    BEGIN
      OPEN ref FOR SELECT city, state FROM cities;   -- Open a cursor
      RETURN ref;                                                       -- Return the cursor to the caller
    END;
    $$ LANGUAGE plpgsql;

ОК, я понимаю, но я хочу передать SQL в качестве параметра, поэтому мне нужно сделать (я думаю)

EXECUTE mysql ......

Но я не вижу, как заставить EXECUTE вернуть курсор

EDIT: Хорошо, теперь я вижу, что я неправильно понял, что делает не динамический случай. Я ожидал, что смогу сделать select show_cities() и заставить его делать то же самое, что и SELECT city, state FROM cities, это не так. Конечно, теперь, когда я думаю об этом, это не удивительно. Я хочу вернуть фактический набор записей.

1 Ответ

0 голосов
/ 11 мая 2018

В вашем случае что-то вроде:

t=# CREATE OR REPLACE FUNCTION data_of(_tbl_type anyelement)
  RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT *
      FROM   %s  -- pg_typeof returns regtype, quoted automatically
      WHERE  true /*or some filter in additional arguments or so */
      ORDER  BY true /*or some filter in additional arguments or so */'
    , pg_typeof(_tbl_type))
   ;
END
$func$ LANGUAGE plpgsql;
CREATE FUNCTION

будет работать:

t=# create table city(i serial, cn text);
CREATE TABLE
t=# insert into city(cn) values ('Moscow'), ('Barcelona'),('Visaginas');
INSERT 0 3
t=# SELECT * FROM data_of(NULL::city);
 i |    cn
---+-----------
 1 | Moscow
 2 | Barcelona
 3 | Visaginas
(3 rows)

все кредиты Эрвину с его https://stackoverflow.com/a/11751557/5315974, что является одним обязательным чтением

...