pl pgsql переместить со значением переменной - PullRequest
0 голосов
/ 02 июля 2018

У меня есть следующая функция, которая реализует разбиение на страницы с помощью курсоров. Функция принимает параметры i_limit и i_offset.

begin
  -- Search resources.
  select into found_keys trgm_search_resources(i_search_query);
  -- Open cursor
  open master_event_curs(found_keys);
  -- Reposition cursor if the @i_offset is specified
  -- TODO: Replace 5 with variable
  move forward i_offset in master_event_curs;

  -- Limit number of retrieved items
  loop
    exit when i >= i_limit;
    -- Fetch data to the record
    fetch master_event_curs into recordvar;
    exit when not found;
    i = i + 1;

    -- Return master event info.
    return next (select get_master_event_info(recordvar."master_event_uid" :: bigint, i_return_langs));
  end loop;
  -- Return info of found master events.
  return;
end;

Когда я использую move forward 5 in master_event_curs и все работает нормально, но когда я пытаюсь заменить 5 динамической переменной i_offset, SQL показывает синтаксическую ошибку {char} unexpected.

Я пытался использовать явное приведение, выполнить эту команду с помощью оператора execute, но ничего не работает.

Может ли кто-нибудь дать мне подсказку, как это сделать?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Какая версия вашего Postgres? Современный PostgreSQL допускает любое выражение:

do $$
  declare s cursor for select * from pg_class;
  r record;
  i_offset int default 5; 
begin
  open s;
  move forward i_offset in s;
  fetch s into r;
  raise notice '%', r;
  close s;
end;
$$;

NOTICE: (pg_toast_2609,99,11585,0,10,0,2834,0,0,0,0,0,t,f,p,t,3,0,f,f,f,f,f,f,t,n,f,0,561,1,,,)

Возможно, вы используете слишком старую версию PostgreSQL или, возможно, возникла какая-то другая проблема, но команды MOVE, FETCH поддерживают выражения, поэтому нет необходимости использовать динамический SQL.

0 голосов
/ 02 июля 2018

Использовать выполнить формат () :

execute format('move forward %s in master_event_curs', i_offset);
...