pl pgsql以可变值移动

时间:2018-07-02 04:58:34

标签: sql postgresql plpgsql

我有以下使用光标实现分页的功能。函数接受参数i_limiti_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并且一切正常时,但是当我尝试用动态i_offset替换5时,SQL显示语法错误{char} unexpected

我尝试使用显式强制转换,使用execute语句执行此命令,但无济于事。

有人可以给我一个提示怎么做吗?

2 个答案:

答案 0 :(得分:2)

使用execute format()

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

答案 1 :(得分:2)

您的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的版本太旧,或者存在任何其他问题,但是MOVEFETCH命令支持表达式,因此没有必要使用动态SQL。