PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 31. libpq - C 库 | 下一页

# 31.7. 捷径接口

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）。`args`和`nargs` 定义了要传递给函数的参数；它们必须匹配已经声明了的函数参数列表。如果某个参数结构的 `isint`字段是真，那么`u.integer`值以指定长度（必须是1，2 或者 4 字节） 的整数发送给服务器；这时候会进行恰当的字节序交换（byte-swapping）。如果`isint`为假， 那么在`*u.ptr`里面的指定字节数的数据将不做任何处理发送出去； 这些数据必须是服务器预期的该函数参数类型的二进制传输格式。 （类型为`int *`的`u.ptr`的声明是过去式了；最好认为它是`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`指针。 在使用结果之前应该检查结果状态。当结果不再使用后，调用者有义务使用 `PQclear`释放`PGresult`。

请注意我们没办法处理空值的参数，空的结果，也没办法在使用这个接口的时候设置有值的结果。

上一页 | 起始页 | 下一页
取消正在处理的查询 | 上一级 | 异步通知