W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
通常,libpq會(huì)收集一個(gè) SQL 命令的整個(gè)結(jié)果并且把它作為單個(gè)PGresult
返回給應(yīng)用。這對(duì)于返回大量行的命令是行不通的。 對(duì)于這類情況,應(yīng)用可以使用PQsendQuery
和
PQgetResult
的單行模式。 在這種模式中,結(jié)果行以一次一行的方式被返回給應(yīng)用。
要進(jìn)入到單行模式,在一次成功的PQsetSingleRowMode
(或者其他兄弟函數(shù))調(diào)用后立即調(diào)用PQsendQuery
。
這種模式選擇只對(duì)當(dāng)前正在執(zhí)行的查詢有效。然后反復(fù)調(diào)用PQgetResult
,直到它返回空,如第 33.4 節(jié)中所示。 如果該查詢返回行,它們會(huì)作為單個(gè)的
PGresult
對(duì)象返回,它們看起來都像普通的查詢結(jié)果,只不過其狀態(tài)代碼是PGRES_SINGLE_TUPLE
而非PGRES_TUPLES_OK
。 在最后一行之后或者緊接著該查詢返回零行之后,一個(gè)狀態(tài)為PGRES_TUPLES_OK
的零行對(duì)象會(huì)被返回,這就是代表不會(huì)有更多行的信號(hào)(但是注意仍然有必要繼續(xù)調(diào)用
PQgetResult
直到它返回空)。 所有這些PGresult
對(duì)象將包含相同的行描述數(shù)據(jù)(列名、類型等等),這些數(shù)據(jù)和通常一個(gè)查詢的PGresult
對(duì)象的相同。 每一個(gè)對(duì)象都應(yīng)該按常規(guī)用PQclear
釋放。
PQsetSingleRowMode
為當(dāng)前正在執(zhí)行的查詢選擇單行模式。
int PQsetSingleRowMode(PGconn *conn);
這個(gè)函數(shù)只能在調(diào)用PQsendQuery
或一個(gè)其兄弟函數(shù)之后立刻調(diào)用,并且要在任何連接上的其他操作之前調(diào)用,例如PQconsumeInput
或PQgetResult
。 如果在正確的時(shí)間被調(diào)用,該函數(shù)會(huì)為當(dāng)前查詢激活單行模式并且返回 1。否則模式會(huì)保持不變并且該函數(shù)返回 0。 在任何情況下,當(dāng)前查詢結(jié)束之后模式都會(huì)恢復(fù)到正常。
在處理一個(gè)查詢時(shí),服務(wù)器可能返回一些行并且接著遇到一個(gè)錯(cuò)誤導(dǎo)致查詢被中斷。通常,libpq會(huì)丟棄掉這樣的行并且至報(bào)告錯(cuò)誤。但是在單行模式中,那些行(錯(cuò)誤之前返回的行)已經(jīng)被返回給應(yīng)用。因此,應(yīng)用將看到一些PGRES_SINGLE_TUPLE
PGresult
對(duì)象并且然后看到一個(gè)PGRES_FATAL_ERROR
對(duì)象。為了得到正確的事務(wù)行為,如果查詢最終失敗,應(yīng)用必須被設(shè)計(jì)為丟棄或者撤銷使用之前處理的行完成的事情。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: