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。
请注意,使用此接口时无法处理集合值结果。此外,该函数必须是一个普通的函数,而不是聚合函数、窗口函数或过程。
如果您在文档中看到任何不正确、与您特定功能的体验不符或需要进一步澄清的内容,请使用此表格来报告文档问题。