9.3 9.4 9.5 9.6 10 11 12 13 14 15
阿里云PostgreSQL 问题报告 纠错本页面

34.6. 一行一行地检索查询结果

通常,libpq会收集一个 SQL 命令的整个结果并且把它作为单个PGresult返回给应用。这对于返回大量行的命令是行不通的。 对于这类情况,应用可以使用PQsendQueryPQgetResult单行模式。 在这种模式中,结果行以一次一行的方式被返回给应用。

要进入单行模式,请在成功调用PQsendQuery(或其兄弟函数)后立即调用 PQsetSingleRowMode。此模式选择仅对当前执行的查询有效。 然后重复调用PQgetResult,直到它返回null,如第 34.4 节中所述。如果查询返回任何行,它们将作为单独的PGresult对象返回, 它们看起来像普通的查询结果,只是具有状态码PGRES_SINGLE_TUPLE而不是 PGRES_TUPLES_OK。在最后一行之后,或者如果查询返回零行,则返回一个带有状态 PGRES_TUPLES_OK的零行对象;这是没有更多行将到达的信号。 (但请注意,仍然需要继续调用PQgetResult直到它返回null。) 所有这些PGresult对象将包含与普通查询的PGresult对象相同的行描述数据 (列名、类型等)。每个对象应像往常一样使用PQclear释放。

当使用管道模式时,在使用PQgetResult检索该查询的结果之前,管道中的每个查询需要被激活单行模式。 参见第 34.5 节 了解更多信息。

PQsetSingleRowMode

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

int PQsetSingleRowMode(PGconn *conn);

这个函数只能在调用PQsendQuery或一个其兄弟函数之后立刻调用,并且要在任何连接上的其他操作之前调用,例如PQconsumeInput PQgetResult。 如果在正确的时间被调用,该函数会为当前查询激活单行模式并且返回 1。否则模式会保持不变并且该函数返回 0。 在任何情况下,当前查询结束之后模式都会恢复到正常。

小心

在处理一个查询时,服务器可能返回一些行并且接着遇到一个错误导致查询被中断。通常,libpq会丢弃掉这样的行并且至报告错误。但是在单行模式中,那些行(错误之前返回的行)已经被返回给应用。因此,应用将看到一些PGRES_SINGLE_TUPLE PGresult对象并且然后看到一个PGRES_FATAL_ERROR对象。为了得到正确的事务行为,如果查询最终失败,应用必须被设计为丢弃或者撤销使用之前处理的行完成的事情。