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
字段为真时,u.integer
值将作为指定长度的整数发送到服务器(这必须是 2 或 4 个字节);会发生正确的字节交换。当 isint
为假时,*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
不被修改。
请注意,使用此接口时无法处理集值结果。此外,函数必须是普通函数,而不是聚合函数、窗口函数或过程。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用 此表单 报告文档问题。