支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

32.8. 快速路徑介面 #

PostgreSQL 提供了一個快速路徑介面,用於將簡單的函數呼叫傳送到伺服器。

提示

這個介面有點過時,因為透過設定預先準備的陳述式來定義函數呼叫,可以實現類似的效能和更大的功能。 然後,執行具有二進位參數和結果傳輸的陳述式,以替代快速路徑函數呼叫。

函數 PQfn 請求透過快速路徑介面執行伺服器函數

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。argsnargs 定義要傳遞給函數的參數;它們必須與宣告的函數引數列表相符。當參數結構的 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;則 isintu 欄位無關緊要。

如果函數傳回 NULL,則 *result_len 設定為 -1,並且 *result_buf 不會被修改。

請注意,使用此介面時無法處理設定值結果。 此外,該函數必須是一個普通函數,而不是彙總函數、視窗函數或程序。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用此表單回報文件問題。