重置顺序扫描位置以重复SPI调用

时间:2013-08-19 21:02:34

标签: postgresql cursor

我正在使用SPI Postgres游标来获取数据。它看起来像这样:

 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.832104355097
-122.094649355859 467.992015648633

此查询在psql和程序调用中返回相同的结果。必须重新启动服务器才能再次获得第一个结果。

似乎表格光标停留在表格中的某个位置。我知道SELECT查询结果序列没有任何保证。是否可以在不重新启动服务器的情况下重新初始化表游标?

1 个答案:

答案 0 :(得分:1)

  

从coords4_1限制5中选择*;

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

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

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