逐行检索查询结果

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 31. libpq - C 库 | 下一页

# 31.5. 逐行检索查询结果

通常，libpq收集SQL命令的全部结果并作为单个`PGresult` 返回到应用中。这对于返回大量行的命令是不可能实现的。对于这种情况， 应用可以在单行模式中使用`PQsendQuery`和`PQgetResult`。 在这个模式中，结果行一次返回一行到应用中，就像从服务器中接收到它们一样。

要进入单行模式，在成功调用`PQsendQuery`（或者一个兄弟函数） 之后立即调用`PQsetSingleRowMode`。这种模式选择只对当前执行的查询有效。 然后重复的调用`PQgetResult`，直到它返回空，在第 31.4 节 中记录。如果查询返回任意行，它们作为独立的`PGresult`对象返回， 就像普通的查询结果，除了状态码是`PGRES_SINGLE_TUPLE`而不是 `PGRES_TUPLES_OK`。在最后一行之后，或者一旦查询返回零行， 返回一个带有状态`PGRES_TUPLES_OK`的零行对象； 这是没有更多行的一个信号。（但是，请注意，仍然需要继续调用`PQgetResult` 直到它返回空。）所有这些`PGresult`对象将包含相同的描述数据 （字段名、类型等），就像该查询的一个普通`PGresult`对象拥有的那样。 像往常一样，每个对象都应该使用`PQclear`释放。

`PQsetSingleRowMode`

  为当前执行的查询选择单行模式。

      int PQsetSingleRowMode(PGconn *conn);

  这个函数只能在`PQsendQuery`或它的一个兄弟函数之后立即调用， 在任何连接上的其他操作，比如`PQconsumeInput`或 `PQgetResult`之前。如果在正确的时间调用了， 该函数为当前查询激活单行模式并返回1。否则模式保持不变并返回0。在任何情况下， 该模式在当前查询完成之后恢复到正常。

小心
处理一个查询时，服务器可能返回一些行然后遇到一个错误，导致查询退出。通常， libpq丢弃任何这样的行并且只报告错误。但是在单行模式中， 这些行将早已返回到应用中。因此，应用将看到一些 `PGRES_SINGLE_TUPLE` `PGresult` 对象跟随在`PGRES_FATAL_ERROR`对象后面。对于适当的事务行为， 如果查询最终失败了，那么应用必须设计为抛弃或撤销先前处理的行。

上一页 | 起始页 | 下一页
异步命令处理 | 上一级 | 取消正在处理的查询