PostgreSQL 提供了一個快速路徑介面,用於將簡單的函數呼叫傳送到伺服器。
這個介面有點過時,因為透過設定預先準備的陳述式來定義函數呼叫,可以實現類似的效能和更大的功能。 然後,執行具有二進位參數和結果傳輸的陳述式,以替代快速路徑函數呼叫。
PGresult *PQfn(PGconn *conn, int fnid, int *result_buf, int *result_len, int result_is_int, const PQArgBlock *args, int nargs); typedef struct { int len; int isint; union { int *ptr; int integer; } u; } PQArgBlock;
fnid
引數是要執行的函數的 OID。args
和 nargs
定義要傳遞給函數的參數;它們必須與宣告的函數引數列表相符。當參數結構的 isint
欄位為 true 時,u.integer
值會以指定長度的整數傳送到伺服器(這必須是 2 或 4 個位元組);會進行適當的位元組交換。當 isint
為 false 時,*u.ptr
中指定數量的位元組會傳送,而無需處理;資料必須是伺服器預期的格式,以二進位格式傳輸函數的引數資料類型。(將 u.ptr
宣告為 int *
類型是歷史遺留;最好將其視為 void *
。)result_buf
指向放置函數傳回值的緩衝區。呼叫者必須已分配足夠的空間來儲存傳回值。(沒有檢查!)實際的結果長度(以位元組為單位)將在 result_len
指向的整數中傳回。如果預期有 2 位元組或 4 位元組的整數結果,請將 result_is_int
設定為 1,否則設定為 0。將 result_is_int
設定為 1 會導致 libpq 在必要時交換位元組,以便將其作為正確的 int
值傳遞給客戶端機器;請注意,對於允許的結果大小,4 位元組的整數會傳遞到 *result_buf
中。當 result_is_int
為 0 時,伺服器傳送的二進位格式位元組字串會未經修改地傳回。(在這種情況下,最好將 result_buf
視為 void *
類型。)
PQfn
始終傳回有效的 PGresult
指標,狀態為 PGRES_COMMAND_OK
(表示成功),如果遇到某些問題,則狀態為 PGRES_FATAL_ERROR
。在使用結果之前,應檢查結果狀態。呼叫者有責任在使用完畢後使用 PQclear
釋放 PGresult
。
若要將 NULL 引數傳遞給函數,請將該參數結構的 len
欄位設定為 -1
;則 isint
和 u
欄位無關緊要。
如果函數傳回 NULL,則 *result_len
設定為 -1
,並且 *result_buf
不會被修改。
請注意,使用此介面時無法處理設定值結果。 此外,該函數必須是一個普通函數,而不是彙總函數、視窗函數或程序。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用此表單回報文件問題。