Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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

请注意,使用此界面时无法处理有值结果集。此外,该函数必须是普通函数,而不是聚合、窗口函数或过程。