Postgresql 中文操作指南

34.6. Retrieving Query Results Row-by-Row #

通常,libpq 收集 SQL 命令的整个结果,并将其作为单个 PGresult 返回到应用程序。这对于返回大量行的命令可能是不可行的。对于此类情况,应用程序可以在 single-row mode 中使用 PQsendQueryPQgetResult 。在此模式中,结果行逐行返回到应用程序,就像从服务器收到它们一样。

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

使用管道模式时,需要为管道中的每个查询激活单行模式,然后再使用 PQgetResult 检索该查询的结果。有关更多信息,请参阅 Section 34.5

  • PQsetSingleRowMode #

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

int PQsetSingleRowMode(PGconn *conn);
  • 该函数只能在 PQsendQuery 或其同级函数之后立即调用,在连接上执行任何其他操作(例如 PQconsumeInputPQgetResult )之前。如果在正确的时间调用,该函数将激活当前查询的单行模式并返回 1。否则模式保持不变,并且函数返回 0。在任何情况下,在完成当前查询后,模式都会恢复为正常模式。

Caution

在处理查询时,服务器可能会返回一些行,然后遇到错误,导致查询中止。通常,libpq 会丢弃任何此类行并仅报告错误。但在单行模式下,这些行将已经返回给应用程序。因此,应用程序将看到一些 PGRES_SINGLE_TUPLE PGresult 对象,后跟 PGRES_FATAL_ERROR 对象。为了获得适当的事务行为,如果查询最终失败,则必须设计应用程序来丢弃或撤销已使用先前处理的行执行的任何操作。