通常,libpq 會收集 SQL 命令的整個結果,並將其以單一 PGresult
的形式傳回給應用程式。對於傳回大量列的命令來說,這可能行不通。對於這種情況,應用程式可以使用 PQsendQuery
和 PQgetResult
在單列模式或分塊模式中。在這些模式下,結果列會在從伺服器接收時傳回給應用程式,單列模式一次傳回一列,分塊模式則以群組形式傳回。
若要進入這些模式之一,請在成功呼叫 PQsendQuery
(或其同級函式)後立即呼叫 PQsetSingleRowMode
或 PQsetChunkedRowsMode
。這種模式選擇僅對目前正在執行的查詢有效。然後重複呼叫 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
或其同級函式之一之後立即呼叫,在對連線執行任何其他操作(例如 PQconsumeInput
或 PQgetResult
)之前。如果在正確的時間呼叫,則該函式會為目前查詢啟用單列模式並傳回 1。否則,模式保持不變,且函式傳回 0。在任何情況下,模式都會在目前查詢完成後還原為正常模式。
PQsetChunkedRowsMode
#為目前正在執行的查詢選擇分塊模式。
int PQsetChunkedRowsMode(PGconn *conn, int chunkSize);
此函式與 PQsetSingleRowMode
類似,只是它指定每次 PGresult
最多檢索 chunkSize
列,而不一定只檢索一列。此函式只能在 PQsendQuery
或其同級函式之一之後立即呼叫,在對連線執行任何其他操作(例如 PQconsumeInput
或 PQgetResult
)之前。如果在正確的時間呼叫,則該函式會為目前查詢啟用分塊模式並傳回 1。否則,模式保持不變,且函式傳回 0。在任何情況下,模式都會在目前查詢完成後還原為正常模式。
在處理查詢時,伺服器可能會先傳回一些資料列,然後遇到錯誤,導致查詢中止。通常,libpq 會捨棄任何此類資料列,並且只回報錯誤。但在單列模式或分塊模式中,某些資料列可能已經傳回給應用程式。因此,應用程式會看到一些 PGRES_SINGLE_TUPLE
或 PGRES_TUPLES_CHUNK
PGresult
物件,接著是一個 PGRES_FATAL_ERROR
物件。為了確保適當的交易行為,應用程式必須設計成捨棄或撤銷先前處理過的資料列所做的任何操作,如果查詢最終失敗的話。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步說明的內容,請使用此表單來回報文件問題。