通常情况下,libpq 会收集 SQL 命令的整个结果,并将其作为单个 PGresult
返回给应用程序。对于返回大量行的命令,这样做可能行不通。对于此类情况,应用程序可以在单行模式下使用 PQsendQuery
和 PQgetResult
。在此模式下,结果行会从服务器接收后逐个返回给应用程序。
要进入单行模式,请在成功调用 PQsetSingleRowMode
后立即调用 PQsendQuery
(或同级函数)。此模式选择仅对当前执行的查询有效。然后重复调用 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
对象。为了获得适当的事务行为,如果查询最终失败,则必须设计应用程序来丢弃或撤消使用先前处理的行所做的任何操作。