2013-05-20 221 views
1

是否有可能在更改Limit和offset值的同时循环访问postgres。我想循环直到达到关系表的末尾。我想动态设置限制和偏移量的原因是我的虚拟内存很少,只有1 GB,因此我的进程正在被终止。循环遍历关系表

目前我采取的方法是手动设置限制和偏移量的值。

select * from my_relational_table limit 1000 offset 0; 
select * from my_relational_table limit 1000 offset 1000; 
select * from my_relational_table limit 1000 offset 2000; 

是否有可能在postgres中自动化进程,以便在到达关系表的末尾时循环停止。

回答

2

是的,这是可能的。您可以使用游标和命令FETCH。

实施例:

postgres=# begin read only; 
BEGIN 
postgres=# declare xx cursor for select * from generate_series(1,100); 
DECLARE CURSOR 
postgres=# fetch 2 xx; 
generate_series 
----------------- 
       1 
       2 
(2 rows) 

postgres=# fetch 2 xx; 
generate_series 
----------------- 
       3 
       4 
(2 rows) 

postgres=# fetch 2 xx; 
generate_series 
----------------- 
       5 
       6 
(2 rows) 

postgres=# fetch 2 xx; 
generate_series 
----------------- 
       7 
       8 
(2 rows) 

postgres=# commit; 
COMMIT 
+0

1为postgresl壳动作。 –

+0

感谢您的帮助。不要以为postgres =#fetch 2 xx需要大量的手动干预;我正在谈论自动化这个过程,以便用户不必一次又一次输入fetch 2 xx –

+0

psql处理的内存请求可以减少\ set FETCH_COUNT 1000 - 其他工作由寻呼机完成 –