2025年9月25日: PostgreSQL 18 釋出!
支援的版本:當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2

32.6. 分塊檢索查詢結果 #

通常情況下,libpq 會收集 SQL 命令的全部結果,並將其作為一個 PGresult 返回給應用程式。對於返回大量行的命令,這可能無法處理。在這些情況下,應用程式可以使用 PQsendQueryPQgetResult單行模式分塊模式。在這些模式下,結果行(或多行)將在從伺服器接收到時返回給應用程式,單行模式下一次返回一行,分塊模式下一次返回一組行。

要進入這些模式之一,請在成功呼叫 PQsendQuery(或其同級函式)後立即呼叫 PQsetSingleRowModePQsetChunkedRowsMode。此模式選擇僅對當前執行的查詢有效。然後,重複呼叫 PQgetResult,直到它返回 null,具體請參見 第 32.4 節。如果查詢返回任何行,它們將作為零個或多個 PGresult 物件返回,這些物件看起來與普通查詢結果一樣,但狀態碼分別為 PGRES_SINGLE_TUPLE(單行模式)或 PGRES_TUPLES_CHUNK(分塊模式),而不是 PGRES_TUPLES_OK。每個 PGRES_SINGLE_TUPLE 物件包含正好一行,而 PGRES_TUPLES_CHUNK 物件包含至少一行,但不超過每塊指定的行數。在最後一行之後,或者在查詢返回零行的情況下立即返回一個零行物件,其狀態碼為 PGRES_TUPLES_OK;這是沒有更多行會到達的訊號。(但請注意,仍然有必要繼續呼叫 PQgetResult 直到它返回 null。)所有這些 PGresult 物件都將包含與該查詢的普通 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 物件。為了正確處理事務,如果查詢最終失敗,應用程式必須被設計成丟棄或撤銷已對先前處理過的行所做的任何操作。

提交更正

如果您在文件中看到任何不正確的內容,與您在使用特定功能時的體驗不符,或者需要進一步的說明,請使用 此表單 來報告文件問題。