成功建立與資料庫伺服器的連線後,此處描述的函數用於執行 SQL 查詢和指令。
PQexec
#提交指令到伺服器並等待結果。
PGresult *PQexec(PGconn *conn, const char *command);
傳回一個 PGresult
指標,或可能是一個空指標。 通常會傳回非空指標,除非在記憶體不足的情況下,或發生嚴重的錯誤,例如無法將指令傳送到伺服器。 應呼叫 PQresultStatus
函數以檢查傳回值是否有任何錯誤(包括空指標的值,在這種情況下它將傳回 PGRES_FATAL_ERROR
)。 使用 PQerrorMessage
來取得關於這類錯誤的更多資訊。
指令字串可以包含多個 SQL 指令(以分號分隔)。 在單一 PQexec
呼叫中傳送的多個查詢會在單一交易中處理,除非查詢字串中包含明確的 BEGIN
/COMMIT
指令,將其劃分為多個交易。(請參閱 第 53.2.2.1 節,以取得關於伺服器如何處理多查詢字串的更多詳細資訊。) 然而請注意,傳回的 PGresult
結構僅描述從字串執行的最後一個指令的結果。 如果其中一個指令失敗,字串的處理將停止於該指令,並且傳回的 PGresult
描述錯誤狀況。
PQexecParams
#提交指令到伺服器並等待結果,並且能夠將參數與 SQL 指令文字分開傳遞。
PGresult *PQexecParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char * const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat);
PQexecParams
就像 PQexec
,但提供額外的功能:可以從指令字串本身單獨指定參數值,並且可以以文字或二進位格式請求查詢結果。
函數參數為
conn
用於傳送指令的連線物件。
command
要執行的 SQL 指令字串。 如果使用了參數,它們在指令字串中被引用為 $1
、$2
等。
nParams
提供的參數數量; 它是陣列 paramTypes[]
、paramValues[]
、paramLengths[]
和 paramFormats[]
的長度。(當 nParams
為零時,陣列指標可以為 NULL
。)
paramTypes[]
透過 OID 指定要指派給參數符號的資料類型。 如果 paramTypes
為 NULL
,或者陣列中的任何特定元素為零,則伺服器會以與處理未類型化的文字字串相同的方式推斷參數符號的資料類型。
paramValues[]
指定參數的實際值。此陣列中的空指標表示對應的參數為空值(null);否則,該指標指向一個以零結尾的文字字串(適用於文字格式),或是伺服器預期的格式的二進位資料(適用於二進位格式)。
paramLengths[]
指定二進位格式參數的實際資料長度。對於空值參數和文字格式參數,此參數會被忽略。如果沒有二進位參數,則此陣列指標可以為空值。
paramFormats[]
指定參數是文字格式(在對應參數的陣列條目中放入零)還是二進位格式(在對應參數的陣列條目中放入一)。如果陣列指標為空值,則所有參數都被假定為文字字串。
以二進位格式傳遞的值需要知道後端預期的內部表示法。例如,整數必須以網路位元組順序傳遞。傳遞 numeric
值需要知道伺服器儲存格式,如同在 src/backend/utils/adt/numeric.c::numeric_send()
和 src/backend/utils/adt/numeric.c::numeric_recv()
中實作的那樣。
resultFormat
指定零以取得文字格式的結果,或指定一以取得二進位格式的結果。(目前沒有提供以不同格式取得不同結果欄位的機制,儘管底層協定是允許的。)
相較於 PQexec
,PQexecParams
的主要優點是可以將參數值與命令字串分離,從而避免了繁瑣且容易出錯的引用和逸出。
與 PQexec
不同,PQexecParams
在給定的字串中最多允許一個 SQL 命令。(其中可以有分號,但不能有多於一個非空的命令。)這是底層協定的限制,但作為防止 SQL 注入攻擊的額外防禦手段,它具有一定的用處。
透過 OID 指定參數類型很繁瑣,特別是如果您不希望將特定的 OID 值硬編碼到程式中。但是,即使在伺服器本身無法確定參數類型,或選擇了與您想要的類型不同的情況下,您也可以避免這樣做。在 SQL 命令文字中,將顯式強制轉換附加到參數符號,以顯示您將傳送的資料類型。例如:
SELECT * FROM mytable WHERE x = $1::bigint;
這會強制將參數 $1
視為 bigint
,而預設情況下,它將被分配與 x
相同的類型。強烈建議在以二進位格式傳送參數值時,透過這種方式或指定數字類型 OID 來強制執行參數類型決策,因為二進位格式的冗餘度比文字格式低,因此伺服器檢測到類型不符錯誤的可能性也較小。
PQprepare
#提交請求以建立具有給定參數的預備語句,並等待完成。
PGresult *PQprepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes);
PQprepare
建立一個預備語句,以便稍後使用 PQexecPrepared
執行。此功能允許重複執行命令,而無需每次都進行解析和規劃;有關詳細信息,請參閱 PREPARE。
該函數從 query
字串建立一個名為 stmtName
的預備語句,該字串必須包含單個 SQL 命令。stmtName
可以是 ""
以建立一個未命名的語句,在這種情況下,任何預先存在的未命名語句都會被自動替換;否則,如果語句名稱已在當前會話中定義,則會發生錯誤。如果使用了任何參數,則在查詢中將它們稱為 $1
、$2
等。nParams
是在陣列 paramTypes[]
中預先指定的類型參數的數量。(當 nParams
為零時,陣列指標可以為 NULL
。)paramTypes[]
通過 OID 指定要分配給參數符號的資料類型。如果 paramTypes
為 NULL
,或者陣列中的任何特定元素為零,則伺服器會以與處理未類型化的文字字串相同的方式為參數符號分配資料類型。此外,查詢可以使用編號高於 nParams
的參數符號;也會為這些符號推斷資料類型。(請參閱 PQdescribePrepared
以了解推斷了哪些資料類型。)
與 PQexec
一樣,結果通常是一個 PGresult
物件,其內容指示伺服器端的成功或失敗。空結果表示記憶體不足或根本無法傳送命令。使用 PQerrorMessage
獲取有關此類錯誤的更多資訊。
也可以通過執行 SQL PREPARE 語句來建立用於 PQexecPrepared
的預備語句。
PQexecPrepared
#提交請求以執行具有給定參數的預備語句,並等待結果。
PGresult *PQexecPrepared(PGconn *conn, const char *stmtName, int nParams, const char * const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat);
PQexecPrepared
類似於 PQexecParams
,但要執行的命令是通過命名先前準備好的語句來指定的,而不是給出查詢字串。此功能允許將重複使用的命令僅解析和規劃一次,而不是每次執行時都進行解析和規劃。該語句必須已在當前會話中準備好。
參數與 PQexecParams
相同,不同之處在於,給出的是預備語句的名稱而不是查詢字串,並且沒有 paramTypes[]
參數(因為在建立預備語句時已確定了它的參數類型,因此不需要它)。
PQdescribePrepared
#提交請求以獲取有關指定的預備語句的資訊,並等待完成。
PGresult *PQdescribePrepared(PGconn *conn, const char *stmtName);
PQdescribePrepared
允許應用程式獲取有關先前準備好的語句的資訊。
stmtName
可以是 ""
或 NULL
以參照未命名的陳述式,否則它必須是現有預先處理 (prepared) 的陳述式名稱。成功時,會傳回狀態為 PGRES_COMMAND_OK
的 PGresult
。函式 PQnparams
和 PQparamtype
可以應用於此 PGresult
,以取得關於預先處理陳述式的參數資訊。函式 PQnfields
、PQfname
、PQftype
等,則提供關於陳述式結果欄位 (如果有的話) 的資訊。
PQdescribePortal
#提交請求以取得關於特定 Portal 的資訊,並等待完成。
PGresult *PQdescribePortal(PGconn *conn, const char *portalName);
PQdescribePortal
允許應用程式取得關於先前建立的 Portal 的資訊。(libpq 不提供任何對 Portal 的直接存取,但您可以使用此函式來檢查使用 DECLARE CURSOR
SQL 指令所建立游標的屬性)。
portalName
可以是 ""
或 NULL
以參照未命名的 Portal,否則它必須是現有 Portal 的名稱。成功時,會傳回狀態為 PGRES_COMMAND_OK
的 PGresult
。函式 PQnfields
、PQfname
、PQftype
等,可以應用於 PGresult
,以取得關於 Portal 結果欄位 (如果有的話) 的資訊。
PQclosePrepared
#提交請求以關閉特定預先處理 (prepared) 的陳述式,並等待完成。
PGresult *PQclosePrepared(PGconn *conn, const char *stmtName);
PQclosePrepared
允許應用程式關閉先前預先處理的陳述式。關閉陳述式會釋放伺服器上的所有相關資源,並允許重複使用其名稱。
stmtName
可以是 ""
或 NULL
以參照未命名的陳述式。如果不存在具有此名稱的陳述式也沒關係,在這種情況下,該操作不執行任何動作。成功時,會傳回狀態為 PGRES_COMMAND_OK
的 PGresult
。
PQclosePortal
#提交請求以關閉特定 Portal,並等待完成。
PGresult *PQclosePortal(PGconn *conn, const char *portalName);
PQclosePortal
允許應用程式觸發關閉先前建立的 Portal。關閉 Portal 會釋放伺服器上的所有相關資源,並允許重複使用其名稱。(libpq 不提供任何對 Portal 的直接存取,但您可以使用此函式來關閉使用 DECLARE CURSOR
SQL 指令所建立的游標)。
portalName
可以是 ""
或 NULL
以參照未命名的 Portal。如果不存在具有此名稱的 Portal 也沒關係,在這種情況下,該操作不執行任何動作。成功時,會傳回狀態為 PGRES_COMMAND_OK
的 PGresult
。
PGresult
結構封裝了伺服器傳回的結果。libpq 應用程式程式設計師應小心維護 PGresult
的抽象性。使用下面的存取函式來取得 PGresult
的內容。避免直接參照 PGresult
結構的欄位,因為它們在未來可能會發生變更。
PQresultStatus
#傳回指令的結果狀態。
ExecStatusType PQresultStatus(const PGresult *res);
PQresultStatus
可以傳回下列其中一個值
PGRES_EMPTY_QUERY
#傳送到伺服器的字串是空的。
PGRES_COMMAND_OK
#成功完成沒有傳回資料的指令。
PGRES_TUPLES_OK
#成功完成傳回資料的指令 (例如 SELECT
或 SHOW
)。
PGRES_COPY_OUT
#開始複製輸出 (從伺服器) 資料傳輸。
PGRES_COPY_IN
#開始複製輸入 (到伺服器) 資料傳輸。
PGRES_BAD_RESPONSE
#無法理解伺服器的回應。
PGRES_NONFATAL_ERROR
#發生非致命錯誤 (通知或警告)。
PGRES_FATAL_ERROR
#發生致命錯誤。
PGRES_COPY_BOTH
#開始複製輸入/輸出 (到和從伺服器) 資料傳輸。此功能目前僅用於串流複製,因此此狀態不應在普通應用程式中發生。
PGRES_SINGLE_TUPLE
#PGresult
包含來自目前指令的單一結果 Tuple。只有在為查詢選擇了單列模式時才會發生此狀態 (請參閱 Section 32.6)。
PGRES_TUPLES_CHUNK
#PGresult
包含來自目前指令的多個結果 Tuple。只有在為查詢選擇了分塊模式時才會發生此狀態 (請參閱 Section 32.6)。Tuple 的數量不會超過傳遞給 PQsetChunkedRowsMode
的限制。
PGRES_PIPELINE_SYNC
#PGresult
代表管線模式中的同步點,由 PQpipelineSync
或 PQsendPipelineSync
請求。只有在選擇了管線模式時才會發生此狀態。
PGRES_PIPELINE_ABORTED
#PGresult
代表已從伺服器接收到錯誤的管線。必須重複呼叫 PQgetResult
,並且每次都會傳回此狀態碼,直到目前管線結束,此時它將傳回 PGRES_PIPELINE_SYNC
並且可以恢復正常處理。
如果結果狀態為 PGRES_TUPLES_OK
、PGRES_SINGLE_TUPLE
或 PGRES_TUPLES_CHUNK
,則可以使用以下描述的函式來檢索查詢傳回的資料列。請注意,即使 SELECT
命令剛好檢索到零個資料列,仍然會顯示 PGRES_TUPLES_OK
。PGRES_COMMAND_OK
用於永遠不會傳回資料列的命令(例如,沒有 RETURNING
子句的 INSERT
或 UPDATE
等)。PGRES_EMPTY_QUERY
的回應可能表示用戶端軟體中存在錯誤。
狀態為 PGRES_NONFATAL_ERROR
的結果永遠不會由 PQexec
或其他查詢執行函式直接傳回;此類結果會改為傳遞到通知處理器(請參閱第 32.13 節)。
PQresStatus
#將 PQresultStatus
傳回的列舉型別轉換為描述狀態碼的字串常數。呼叫者不應釋放結果。
char *PQresStatus(ExecStatusType status);
PQresultErrorMessage
#傳回與命令相關聯的錯誤訊息,如果沒有錯誤,則傳回空字串。
char *PQresultErrorMessage(const PGresult *res);
如果發生錯誤,傳回的字串將包含尾隨換行符。呼叫者不應直接釋放結果。當相關聯的 PGresult
控制代碼傳遞到 PQclear
時,它將被釋放。
在呼叫 PQexec
或 PQgetResult
之後,PQerrorMessage
(在連線上)將傳回與 PQresultErrorMessage
(在結果上)相同的字串。但是,PGresult
將保留其錯誤訊息直到銷毀,而連線的錯誤訊息將在執行後續操作時更改。當您想知道與特定 PGresult
相關聯的狀態時,請使用 PQresultErrorMessage
;當您想知道連線上最新操作的狀態時,請使用 PQerrorMessage
。
PQresultVerboseErrorMessage
#傳回與 PGresult
物件相關聯的錯誤訊息的重新格式化版本。
char *PQresultVerboseErrorMessage(const PGresult *res, PGVerbosity verbosity, PGContextVisibility show_context);
在某些情況下,用戶端可能希望獲得先前報告的錯誤的更詳細版本。PQresultVerboseErrorMessage
透過計算如果指定的詳細程度設定在產生給定的 PGresult
時對連線有效,則 PQresultErrorMessage
會產生的訊息來解決此需求。如果 PGresult
不是錯誤結果,則會改為報告 “PGresult is not an error result”。傳回的字串包含尾隨換行符。
與大多數其他用於從 PGresult
提取資料的函式不同,此函式的結果是新配置的字串。當不再需要該字串時,呼叫者必須使用 PQfreemem()
釋放它。
如果記憶體不足,則可能會傳回 NULL。
PQresultErrorField
#傳回錯誤報告的個別欄位。
char *PQresultErrorField(const PGresult *res, int fieldcode);
fieldcode
是一個錯誤欄位識別碼;請參閱下面列出的符號。如果 PGresult
不是錯誤或警告結果,或不包含指定的欄位,則傳回 NULL
。欄位值通常不包含尾隨換行符。呼叫者不應直接釋放結果。當相關聯的 PGresult
控制代碼傳遞到 PQclear
時,它將被釋放。
以下欄位代碼可用
PG_DIAG_SEVERITY
#嚴重性;欄位內容為 ERROR
、FATAL
或 PANIC
(在錯誤訊息中),或 WARNING
、NOTICE
、DEBUG
、INFO
或 LOG
(在通知訊息中),或這些訊息的本地化翻譯。始終存在。
PG_DIAG_SEVERITY_NONLOCALIZED
#嚴重性;欄位內容為 ERROR
、FATAL
或 PANIC
(在錯誤訊息中),或 WARNING
、NOTICE
、DEBUG
、INFO
或 LOG
(在通知訊息中)。這與 PG_DIAG_SEVERITY
欄位相同,只是內容永遠不會本地化。這僅存在於 PostgreSQL 9.6 及更高版本產生的報告中。
PG_DIAG_SQLSTATE
#錯誤的 SQLSTATE 代碼。SQLSTATE 代碼識別已發生的錯誤類型;前端應用程式可以使用它來執行特定操作(例如錯誤處理)以回應特定的資料庫錯誤。有關可能的 SQLSTATE 代碼的列表,請參閱附錄 A。此欄位不可本地化,並且始終存在。
PG_DIAG_MESSAGE_PRIMARY
#主要的人工可讀錯誤訊息(通常為一行)。始終存在。
PG_DIAG_MESSAGE_DETAIL
#詳細資料:一個可選的輔助錯誤訊息,包含有關問題的更多詳細資料。可能會跨越多行。
PG_DIAG_MESSAGE_HINT
#提示:一個可選的建議,說明如何解決問題。這旨在與詳細資訊不同,因為它提供建議(可能不適當),而不是硬性事實。可能會跨越多行。
PG_DIAG_STATEMENT_POSITION
#一個包含十進位整數的字串,指示錯誤游標位置,作為原始語句字串中的索引。第一個字元的索引為 1,位置以字元而不是位元組為單位進行測量。
PG_DIAG_INTERNAL_POSITION
#這與 PG_DIAG_STATEMENT_POSITION
欄位的定義相同,但是當游標位置引用內部產生的命令而不是用戶端提交的命令時,將使用它。當出現此欄位時,始終會顯示 PG_DIAG_INTERNAL_QUERY
欄位。
PG_DIAG_INTERNAL_QUERY
#失敗的內部產生命令的文字。例如,這可能是 PL/pgSQL 函式發出的 SQL 查詢。
PG_DIAG_CONTEXT
#發生錯誤的上下文的指示。目前,這包括活動程序語言函數和內部產生的查詢的呼叫堆疊追蹤。追蹤每行一個條目,最近的在前。
PG_DIAG_SCHEMA_NAME
#如果錯誤與特定的資料庫物件相關,則會顯示包含該物件的綱要名稱(如果有的話)。
PG_DIAG_TABLE_NAME
#如果錯誤與特定的資料表相關,則會顯示資料表的名稱。(請參閱綱要名稱欄位以取得資料表的綱要名稱。)
PG_DIAG_COLUMN_NAME
#如果錯誤與特定的資料表欄位相關,則會顯示欄位的名稱。(請參閱綱要和資料表名稱欄位以識別資料表。)
PG_DIAG_DATATYPE_NAME
#如果錯誤與特定的資料類型相關,則會顯示資料類型的名稱。(請參閱綱要名稱欄位以取得資料類型的綱要名稱。)
PG_DIAG_CONSTRAINT_NAME
#如果錯誤與特定的約束相關,則會顯示約束的名稱。 請參閱上面列出的欄位以取得相關聯的資料表或網域。(就此目的而言,索引被視為約束,即使它們不是使用約束語法建立的。)
PG_DIAG_SOURCE_FILE
#報告錯誤的原始碼檔案名稱。
PG_DIAG_SOURCE_LINE
#報告錯誤的原始碼行號。
PG_DIAG_SOURCE_FUNCTION
#報告錯誤的原始碼函式名稱。
綱要名稱、資料表名稱、欄位名稱、資料類型名稱和約束名稱的欄位僅適用於有限數量的錯誤類型;請參閱附錄 A。 不要假設任何這些欄位的存在保證了另一個欄位的存在。 核心錯誤來源會觀察到上述相互關係,但使用者定義的函式可能會以其他方式使用這些欄位。 同樣地,不要假設這些欄位表示目前資料庫中的當前物件。
客戶端負責格式化顯示的資訊以滿足其需求;特別是,它應該根據需要中斷長行。 錯誤訊息欄位中出現的換行符號應被視為段落分隔符,而不是換行符。
由 libpq 內部產生的錯誤將具有嚴重性和主要訊息,但通常沒有其他欄位。
請注意,錯誤欄位僅可從 PGresult
物件取得,而不能從 PGconn
物件取得;沒有 PQerrorField
函式。
PQclear
#釋放與 PGresult
關聯的儲存空間。 每個指令結果在不再需要時,都應該透過 PQclear
釋放。
void PQclear(PGresult *res);
如果引數是 NULL
指標,則不執行任何操作。
您可以將 PGresult
物件保留任意長的時間;當您發出新指令時,甚至在您關閉連線時,它都不會消失。 要擺脫它,您必須呼叫 PQclear
。 如果不這樣做,將導致您的應用程式中出現記憶體洩漏。
這些函式用於從表示成功查詢結果的 PGresult
物件中擷取資訊(也就是說,具有狀態 PGRES_TUPLES_OK
、PGRES_SINGLE_TUPLE
或 PGRES_TUPLES_CHUNK
的物件)。 它們還可用於從成功的 Describe 操作中擷取資訊:Describe 的結果具有與查詢實際執行所提供的所有相同的欄位資訊,但它具有零列。 對於具有其他狀態值的物件,這些函式的作用就像結果具有零列和零欄位一樣。
PQntuples
#傳回查詢結果中的列數(元組)。 (請注意,PGresult
物件限制為不超過 INT_MAX
列,因此 int
結果就足夠了。)
int PQntuples(const PGresult *res);
PQnfields
#傳回查詢結果中每列的欄位(欄)數。
int PQnfields(const PGresult *res);
PQfname
#傳回與給定欄位號碼關聯的欄位名稱。 欄位號碼從 0 開始。 呼叫者不應直接釋放結果。 當關聯的 PGresult
句柄傳遞給 PQclear
時,它將被釋放。
char *PQfname(const PGresult *res, int column_number);
如果欄位號碼超出範圍,則傳回 NULL
。
PQfnumber
#傳回與給定欄位名稱關聯的欄位號碼。
int PQfnumber(const PGresult *res, const char *column_name);
如果給定的名稱與任何欄位都不匹配,則傳回 -1。
給定的名稱被視為 SQL 指令中的識別碼,也就是說,除非用雙引號引起來,否則它會被轉換為小寫。 例如,給定從 SQL 指令產生的查詢結果
SELECT 1 AS FOO, 2 AS "BAR";
我們將得到結果
PQfname(res, 0) foo PQfname(res, 1) BAR PQfnumber(res, "FOO") 0 PQfnumber(res, "foo") 0 PQfnumber(res, "BAR") -1 PQfnumber(res, "\"BAR\"") 1
PQftable
#傳回從中提取給定欄位的資料表的 OID。 欄位號碼從 0 開始。
Oid PQftable(const PGresult *res, int column_number);
如果欄位號碼超出範圍,或者如果指定的欄位不是對資料表欄位的簡單參照,則傳回 InvalidOid
。 您可以查詢系統資料表 pg_class
以準確確定參照的是哪個資料表。
當您包含 libpq 標頭檔時,將定義 Oid
類型和常數 InvalidOid
。 它們都將是某種整數類型。
PQftablecol
#傳回構成指定查詢結果欄位的欄位的欄位號碼(在其資料表中)。 查詢結果欄位號碼從 0 開始,但資料表欄位具有非零號碼。
int PQftablecol(const PGresult *res, int column_number);
如果欄位號碼超出範圍,或者如果指定的欄位不是對資料表欄位的簡單參照,則傳回零。
PQfformat
#傳回指示給定欄位格式的格式代碼。 欄位號碼從 0 開始。
int PQfformat(const PGresult *res, int column_number);
格式代碼零表示文字資料表示形式,而格式代碼一表示二進位表示形式。(其他代碼保留供將來定義。)
PQftype
#傳回與指定欄位編號相關聯的資料類型。傳回的整數是該類型的內部 OID 編號。欄位編號從 0 開始。
Oid PQftype(const PGresult *res, int column_number);
您可以查詢系統表 pg_type
以取得各種資料類型的名稱和屬性。OID內建資料類型的 OID 定義在 PostgreSQL 安裝目錄的 include
目錄下的 catalog/pg_type_d.h
檔案中。
PQfmod
#傳回與指定欄位編號相關聯的欄位類型修飾詞。欄位編號從 0 開始。
int PQfmod(const PGresult *res, int column_number);
修飾詞值的解釋方式與類型相關;它們通常指示精度或大小限制。值 -1 用於表示「無可用資訊」。大多數資料類型不使用修飾詞,在這種情況下,值始終為 -1。
PQfsize
#傳回與指定欄位編號相關聯的欄位大小(以位元組為單位)。欄位編號從 0 開始。
int PQfsize(const PGresult *res, int column_number);
PQfsize
傳回資料庫列中為此欄位配置的空間,換句話說,就是伺服器內部表示資料類型的大小。(因此,它對客戶端來說實際上不是很有用。)負值表示資料類型是可變長度的。
PQbinaryTuples
#如果 PGresult
包含二進位資料,則傳回 1,如果包含文字資料,則傳回 0。
int PQbinaryTuples(const PGresult *res);
此函數已被棄用(除了與 COPY
連接使用之外),因為單個 PGresult
可能在某些欄位中包含文字資料,而在其他欄位中包含二進位資料。PQfformat
是首選。PQbinaryTuples
僅當結果的所有欄位都是二進位格式 (format 1) 時,才會傳回 1。
PQgetvalue
#傳回 PGresult
的一列的單個欄位值。列和欄位編號從 0 開始。呼叫者不應直接釋放結果。當關聯的 PGresult
控制代碼傳遞給 PQclear
時,它將被釋放。
char *PQgetvalue(const PGresult *res, int row_number, int column_number);
對於文字格式的資料,PQgetvalue
傳回的值是欄位值的以 null 結尾的字元串表示形式。對於二進位格式的資料,該值採用由資料類型的 typsend
和 typreceive
函數確定的二進位表示形式。(在這種情況下,該值實際上也後跟一個零位元組,但這通常沒有用,因為該值可能包含嵌入的 null。)
如果欄位值為 null,則傳回空字串。請參閱 PQgetisnull
以區分 null 值和空字串值。
PQgetvalue
傳回的指標指向作為 PGresult
結構一部分的儲存體。不應修改它指向的資料,並且如果要在 PGresult
結構本身的生命週期之後使用該資料,則必須將該資料顯式複製到其他儲存體中。
PQgetisnull
#測試欄位是否為 null 值。列和欄位編號從 0 開始。
int PQgetisnull(const PGresult *res, int row_number, int column_number);
如果欄位為 null,則此函數傳回 1,如果欄位包含非 null 值,則傳回 0。(請注意,對於 null 欄位,PQgetvalue
將傳回空字串,而不是 null 指標。)
PQgetlength
#傳回欄位值的實際長度(以位元組為單位)。列和欄位編號從 0 開始。
int PQgetlength(const PGresult *res, int row_number, int column_number);
這是特定資料值的實際資料長度,也就是說,PQgetvalue
指向的物件的大小。對於文字資料格式,這與 strlen()
相同。對於二進位格式,這是基本資訊。請注意,不應 依賴 PQfsize
來取得實際資料長度。
PQnparams
#傳回預處理語句的參數數量。
int PQnparams(const PGresult *res);
只有在檢查 PQdescribePrepared
的結果時,此函數才有用。對於其他類型的結果,它將傳回零。
PQparamtype
#傳回指示語句參數的資料類型。參數編號從 0 開始。
Oid PQparamtype(const PGresult *res, int param_number);
只有在檢查 PQdescribePrepared
的結果時,此函數才有用。對於其他類型的結果,它將傳回零。
PQprint
#將所有列印出,並可選擇將欄位名稱列印到指定的輸出流。
void PQprint(FILE *fout, /* output stream */ const PGresult *res, const PQprintOpt *po); typedef struct { pqbool header; /* print output field headings and row count */ pqbool align; /* fill align the fields */ pqbool standard; /* old brain dead format */ pqbool html3; /* output HTML tables */ pqbool expanded; /* expand tables */ pqbool pager; /* use pager for output if needed */ char *fieldSep; /* field separator */ char *tableOpt; /* attributes for HTML table element */ char *caption; /* HTML table caption */ char **fieldName; /* null-terminated array of replacement field names */ } PQprintOpt;
此函數以前由 psql 用於列印查詢結果,但現在已不再如此。請注意,它假定所有資料都採用文字格式。
這些函數用於從 PGresult
物件中提取其他資訊。
PQcmdStatus
#傳回從產生 PGresult
的 SQL 命令中的命令狀態標籤。
char *PQcmdStatus(PGresult *res);
通常這只是命令的名稱,但它可能包含其他資料,例如處理的列數。呼叫者不應直接釋放結果。當關聯的 PGresult
控制代碼傳遞給 PQclear
時,它將被釋放。
PQcmdTuples
#傳回受 SQL 命令影響的列數。
char *PQcmdTuples(PGresult *res);
此函數傳回一個字串,其中包含受SQL產生 PGresult
的 SQL 指令。這個函式只能在執行 SELECT
、CREATE TABLE AS
、INSERT
、UPDATE
、DELETE
、MERGE
、MOVE
、FETCH
或 COPY
指令,或執行一個包含 INSERT
、UPDATE
、DELETE
或 MERGE
指令的預處理查詢 (EXECUTE
) 之後使用。如果產生 PGresult
的指令是其他任何指令,PQcmdTuples
會回傳一個空字串。呼叫者不應該直接釋放回傳值。當相關的 PGresult
控制代碼傳遞給 PQclear
時,它會被釋放。
PQoidValue
#如果SQL指令是 INSERT
,而且確實插入了一列到有 OID 的資料表中,或是執行一個包含適當 INSERT
指令的預處理查詢 (EXECUTE
),則回傳被插入列的 OID。否則,這個函式會回傳 InvalidOid
。如果受 INSERT
指令影響的資料表沒有包含 OID,這個函式也會回傳 InvalidOid
。
Oid PQoidValue(const PGresult *res);
PQoidStatus
#這個函式已不建議使用,建議改用 PQoidValue
,而且它不是執行緒安全的。它回傳一個包含被插入列 OID 的字串,而 PQoidValue
回傳 OID 值。
char *PQoidStatus(const PGresult *res);
PQescapeLiteral
#char *PQescapeLiteral(PGconn *conn, const char *str, size_t length);
PQescapeLiteral
會為了在 SQL 指令中使用而跳脫字串。當將資料值以字面常數形式插入 SQL 指令中時,這非常有用。某些字元 (例如引號和反斜線) 必須跳脫,以防止它們被 SQL 解析器特別解釋。PQescapeLiteral
執行此操作。
PQescapeLiteral
會在以 malloc()
配置的記憶體中回傳 str
參數的跳脫版本。當不再需要結果時,應該使用 PQfreemem()
釋放此記憶體。不需要結束零位元組,也不應該將其計入 length
中。(如果在處理 length
個位元組之前找到結束零位元組,PQescapeLiteral
會在零處停止;因此其行為相當於 strncpy
。)回傳字串的所有特殊字元都會被取代,以便它們可以被 PostgreSQL 字串常值解析器正確處理。也會加入結束零位元組。必須包圍 PostgreSQL 字串常值的單引號包含在結果字串中。
如果發生錯誤,PQescapeLiteral
會回傳 NULL
,並且在 conn
物件中儲存適當的訊息。
在處理從不可靠來源收到的字串時,進行正確的跳脫特別重要。否則存在安全風險:您容易受到 「SQL 注入」 攻擊,其中不想要的 SQL 指令會被饋送到您的資料庫。
請注意,當資料值作為單獨的參數在 PQexecParams
或其同級常式中傳遞時,不需要也不正確進行跳脫。
PQescapeIdentifier
#char *PQescapeIdentifier(PGconn *conn, const char *str, size_t length);
PQescapeIdentifier
會為了作為 SQL 識別符 (例如資料表、欄或函數名稱) 使用而跳脫字串。當使用者提供的識別符可能包含特殊字元,否則這些字元不會被 SQL 解析器解釋為識別符的一部分,或者當識別符可能包含應該保留大小寫的大寫字元時,這非常有用。
PQescapeIdentifier
會在以 malloc()
配置的記憶體中回傳 str
參數的跳脫版本,作為 SQL 識別符。當不再需要結果時,必須使用 PQfreemem()
釋放此記憶體。不需要結束零位元組,也不應該將其計入 length
中。(如果在處理 length
個位元組之前找到結束零位元組,PQescapeIdentifier
會在零處停止;因此其行為相當於 strncpy
。)回傳字串的所有特殊字元都會被取代,以便它可以被正確處理為 SQL 識別符。也會加入結束零位元組。回傳字串也會被雙引號包圍。
如果發生錯誤,PQescapeIdentifier
會回傳 NULL
,並且在 conn
物件中儲存適當的訊息。
與字串常值一樣,為了防止 SQL 注入攻擊,當從不可靠來源收到 SQL 識別符時,必須跳脫它們。
PQescapeStringConn
#size_t PQescapeStringConn(PGconn *conn, char *to, const char *from, size_t length, int *error);
PQescapeStringConn
會跳脫字串常值,很像 PQescapeLiteral
。與 PQescapeLiteral
不同,呼叫者負責提供適當大小的緩衝區。此外,PQescapeStringConn
不會產生必須包圍 PostgreSQL 字串常值的單引號;它們應該在結果被插入的 SQL 指令中提供。參數 from
指向要跳脫的字串的第一個字元,並且 length
參數給出此字串中的位元組數。不需要結束零位元組,也不應該將其計入 length
中。(如果在處理 length
個位元組之前找到結束零位元組,PQescapeStringConn
會在零處停止;因此其行為相當於 strncpy
。)to
應指向能夠容納至少比 length
值大兩倍的一個位元組的緩衝區,否則行為未定義。如果 to
和 from
字串重疊,行為同樣未定義。
如果 error
參數不是 NULL
,成功時 *error
會設為零,錯誤時則設為非零值。目前唯一可能的錯誤狀況是來源字串中存在無效的多位元組編碼。錯誤時仍會產生輸出字串,但預期伺服器會拒絕該字串,因為其格式錯誤。發生錯誤時,無論 error
是否為 NULL
,都會在 conn
物件中儲存適當的訊息。
PQescapeStringConn
會傳回寫入到 to
的位元組數,不包含結尾的零位元組。
PQescapeString
#PQescapeString
是 PQescapeStringConn
的舊版,已不建議使用。
size_t PQescapeString (char *to, const char *from, size_t length);
與 PQescapeStringConn
唯一的區別是 PQescapeString
不接受 PGconn
或 error
參數。因此,它無法根據連線屬性(例如字元編碼)調整其行為,因此可能會產生錯誤的結果。此外,它也無法回報錯誤狀況。
PQescapeString
可以安全地用於一次只與一個 PostgreSQL 連線搭配使用的用戶端程式中(在這種情況下,它可以「私下」找出它需要知道的資訊)。在其他情況下,它是一種安全風險,應避免使用,而改用 PQescapeStringConn
。
PQescapeByteaConn
#將二進制資料逸出,以便在類型為 bytea
的 SQL 指令中使用。與 PQescapeStringConn
相同,這僅在將資料直接插入 SQL 指令字串時使用。
unsigned char *PQescapeByteaConn(PGconn *conn, const unsigned char *from, size_t from_length, size_t *to_length);
當用作 bytea
常值的一部分時,某些位元組值必須逸出。SQL陳述式。PQescapeByteaConn
使用十六進制編碼或反斜線逸出來逸出位元組。有關更多資訊,請參閱第 8.4 節。
from
參數指向要逸出的字串的第一個位元組,而 from_length
參數指定此二進制字串中的位元組數。(結尾的零位元組既不需要也不會被計算。)to_length
參數指向一個變數,該變數將保存產生的逸出字串長度。此結果字串長度包括結果的結尾零位元組。
PQescapeByteaConn
會傳回以 malloc()
分配的記憶體中,from
參數二進制字串的逸出版本。不再需要結果時,應使用 PQfreemem()
釋放此記憶體。傳回字串的所有特殊字元都會被取代,以便 PostgreSQL 字串常值剖析器和 bytea
輸入函式可以正確處理它們。還會加入結尾的零位元組。必須包圍 PostgreSQL 字串常值的單引號不屬於結果字串的一部分。
發生錯誤時,會傳回空指標,並在 conn
物件中儲存適當的錯誤訊息。目前,唯一可能的錯誤是結果字串的記憶體不足。
PQescapeBytea
#PQescapeBytea
是 PQescapeByteaConn
的舊版,已不建議使用。
unsigned char *PQescapeBytea(const unsigned char *from, size_t from_length, size_t *to_length);
與 PQescapeByteaConn
唯一的區別是 PQescapeBytea
不接受 PGconn
參數。因此,PQescapeBytea
只能安全地用於一次只使用一個 PostgreSQL 連線的用戶端程式中(在這種情況下,它可以「私下」找出它需要知道的資訊)。如果在同時使用多個資料庫連線的程式中使用,它可能會產生錯誤的結果(在這種情況下,請使用 PQescapeByteaConn
)。
PQunescapeBytea
#將二進制資料的字串表示形式轉換為二進制資料 — 與 PQescapeBytea
相反。在以文字格式擷取 bytea
資料時需要此功能,但在以二進制格式擷取時則不需要。
unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length);
from
參數指向一個字串,例如在應用於 bytea
欄位時,PQgetvalue
可能傳回的字串。PQunescapeBytea
將此字串表示形式轉換為其二進制表示形式。它會傳回一個使用 malloc()
分配的緩衝區指標,錯誤時則傳回 NULL
,並將緩衝區的大小放入 to_length
中。不再需要結果時,必須使用 PQfreemem
釋放它。
此轉換與 PQescapeBytea
並非完全相反,因為從 PQgetvalue
收到的字串預計不會被「逸出」。特別是,這表示不需要考慮字串引號,因此不需要 PGconn
參數。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。