PostgreSQL实现类Python生成器逐次返回10条数据结果重复怎么解决
问题原因
- 过滤条件逻辑和设计思路不符:你设计的思路是返回「大于序列当前值」的记录,但代码里写的是
i <= val+10,该条件会包含表最开头的10条记录,配合limit 10每次都会优先返回开头的固定数据 - 查询缺少排序规则:PostgreSQL 执行不带
ORDER BY的limit查询时,不保证返回结果的顺序,默认会优先读取存储位置靠前的记录,进一步导致每次返回的结果都是相同的前10条
修复方案
首先调整序列的起始值,保证第一次调用就能匹配从第一条开始取数的逻辑:
alter sequence an_iter restart with 0 increment by 10;
然后修改函数的查询逻辑,修正过滤条件、添加排序规则:
CREATE OR REPLACE FUNCTION public.get_data() RETURNS SETOF ppdb LANGUAGE plpgsql AS $func$ declare val integer := 0; BEGIN select nextval('an_iter') into val; Return Query SELECT * from ppdb where i > val order by i asc limit 10; END $func$;
效果验证
修改后第一次调用函数,nextval返回0,查询条件为i>0,返回i=110的10条记录;第二次调用`nextval`返回10,查询条件为`i>10`,返回i=1120的10条记录,完全符合你要的类似Python生成器的分批取数效果。
内容的提问来源于stack exchange,提问作者Rumesh Madhusanka
相关产品推荐
相关产品推荐

