2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2

32.6. 分块检索查询结果 #

通常情况下,libpq 会收集 SQL 命令的整个结果并将其作为单个 PGresult 返回给应用程序。对于返回大量行的命令,这可能无法实现。对于这种情况,应用程序可以使用 PQsendQueryPQgetResult单行模式分块模式下。在这些模式下,结果行将随着从服务器接收到的数据逐一返回给应用程序,单行模式一次返回一行,而分块模式一次返回一组行。

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

使用管道模式时,需要在使用 PQgetResult 检索每个管道中的查询结果之前,为每个查询激活单行模式或分块模式。有关更多信息,请参阅 第 32.5 节

PQsetSingleRowMode #

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

int PQsetSingleRowMode(PGconn *conn);

此函数只能在 PQsendQuery 或其兄弟函数之后立即调用,在对连接进行任何其他操作(如 PQconsumeInputPQgetResult)之前。如果在正确的时间调用,该函数会为当前查询激活单行模式并返回 1。否则模式保持不变,函数返回 0。无论如何,模式会在当前查询完成后恢复为正常。

PQsetChunkedRowsMode #

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

int PQsetChunkedRowsMode(PGconn *conn, int chunkSize);

此函数类似于 PQsetSingleRowMode,只是它指定每个 PGresult 检索最多 chunkSize 行,而不仅仅是一行。此函数只能在 PQsendQuery 或其兄弟函数之后立即调用,在对连接进行任何其他操作(如 PQconsumeInputPQgetResult)之前。如果在正确的时间调用,该函数会为当前查询激活分块模式并返回 1。否则模式保持不变,函数返回 0。无论如何,模式会在当前查询完成后恢复为正常。

注意

在处理查询时,服务器可能会返回一些行,然后遇到错误,导致查询中止。通常情况下,libpq 会丢弃所有这些行,只报告错误。但在单行模式或分块模式下,一些行可能已经返回给应用程序。因此,应用程序将看到一些 PGRES_SINGLE_TUPLEPGRES_TUPLES_CHUNK PGresult 对象,之后是一个 PGRES_FATAL_ERROR 对象。为了实现正确的事务行为,应用程序必须设计为丢弃或撤消对先前处理行的任何操作,如果查询最终失败。

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表格 报告文档问题。