我有以下使用光标实现分页的功能。函数接受参数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
并且一切正常时,但是当我尝试用动态i_offset
替换5时,SQL显示语法错误{char} unexpected
。
我尝试使用显式强制转换,使用execute
语句执行此命令,但无济于事。
有人可以给我一个提示怎么做吗?
答案 0 :(得分:2)
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的版本太旧,或者存在任何其他问题,但是MOVE
,FETCH
命令支持表达式,因此没有必要使用动态SQL。