Как объявить связанный курсор с настроенным именем столбца в pl / pgsql - PullRequest
0 голосов
/ 10 декабря 2018

Я хотел бы использовать курсор в функции с именем таблицы в качестве переменной функции, простой пример - запрос выбора через курсор.

Из документации PostgreSQL я обнаружил, что могу использовать

Declare curs3 CURSOR (key integer) FOR SELECT * FROM tenk1 WHERE unique1 = key;

Но при вводе

declare curs1 cursor (key integer) for execute 'select ' || quote_ident(colname) || ' from ' || quote_ident(tablename);

возвращается ERROR: syntax error at or near "'select '".

С другой стороны, если я напишу функцию с refcursor следующим образом:

CREATE or replace FUNCTION cursor_hw(colname text,tablename text) RETURNS setof text  AS $$

declare curs1 refcursor;
BEGIN
  open curs1 for execute 'select ' || quote_ident(colname) || ' from ' || quote_ident(tablename);
  for x in curs1 loop
    return next x;
  end loop;
END; $$ LANGUAGE plpgsql;

Она вернет [42601] ERROR: cursor FOR loop must use a bound cursor variable.

Любая помощь будет оценена, большое спасибо!

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете предпочесть простой FOR record_variable IN EXECUTE <query> вместо OPEN FETCH для динамического SQL.

CREATE or replace FUNCTION cursor_hw(colname text,tablename text) 
RETURNS setof text  AS 
$$
DECLARE 
x RECORD;
BEGIN
  FOR x IN  execute  'select ' || quote_ident(colname) || ' from ' 
                               || quote_ident(tablename)
   LOOP
      IF x.first_name like 'D%' THEN
        RETURN NEXT x;
      END IF;
  END LOOP;
END; 
$$ LANGUAGE plpgsql;

выполнение

knayak=# select cursor_hw('first_name','employees');
 cursor_hw
-----------
 Donald
 Douglas
 David
 Diana
 Daniel
 Den
 David
 Danielle
 David
(9 rows)
...