2013-08-19 31 views
1

我正在使用SPI Postgres光标获取数据。它看起来像这样:为重复的SPI调用重置顺序扫描位置

SPI_connect(); 
snprintf(sql, sizeof(sql), "SELECT * FROM %s;", dataTableName); 
cursorPlan = SPI_prepare(sql, 0, NULL); 
cursorPortal = SPI_cursor_open(NULL, cursorPlan, NULL, NULL, 1); 
SPI_cursor_fetch(cursorPortal, direction, CURSOR_BUFFER_SIZE); 

之前取我执行

select * from coords4_1 limit 5; 

,并得到

  x   |   y 
-------------------+------------------- 
-138.272695243359 | -185.774616431445 
-170.132300350815 | 35.1918349042535 
    148.739065974951 | 213.159712031484 
    105.91473756358 | -375.821752008051 
    418.450653553009 | -69.8341866955161 

然后我开始获取。表很大,所以我中断了一些原因。

我再次执行

select * from coords4_1 limit 5; 

,并得到

231.340305414051 -443.616589065641 
65.2282955124974 412.122126668692 
434.384567663074 63.0593989044428 
-19.7921730577946 -223.4355097 
-122.094649355859 467.992015648633 

该查询返回的psql和程序调用相同的结果。有必要重新启动服务器以再次获得第一个结果。

似乎表格光标停留在表格中的某个位置。我知道SELECT查询结果序列没有保证。是否有可能重新启动表游标而无需重新启动服务器?

回答

1

select * from coords4_1 limit 5;

这里没有ORDER BY子句,所以你告诉服务器“给我你想要的五个结果”。

由于实现细节的原因,PostgreSQL通常大致按顺序返回表格内容。这是因为同步的扫描代码。这是不能保证的,任何依赖它的代码都会被彻底打破。

如果您想要类似游标的行为,请添加ORDER BY子句或use a real cursor