PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 32. 大对象 | 下一页

# 32.4. 服务器端函数

为操作SQL大对象而改变的服务器端函数在表 32-1中列出。

表 32-1. 面向SQL的大对象函数

函数 | 返回类型 | 描述 | 示例 | 结果
--- | --- | --- | --- | ---
``lo_from_bytea(`loid` `oid`, `string` `bytea`)`` | `oid` | 创建一个大对象并存储数据，返回它的OID。 传递`0`让系统选择一个OID。 | `lo_from_bytea(0, E'\\xffffff00')` | `24528`
``lo_put(`loid` `oid`, `offset` `bigint`, `str` `bytea`)`` | `void` | 以给定的偏移量写入数据。 | `lo_put(24528, 1, E'\\xaa')` |
``lo_get(`loid` `oid` [, `from` `bigint`, `for` `int`])`` | `bytea` | 摘取内容或者它的子串。 | `lo_get(24528, 0, 3)` | `\xffaaff`

还有一些对应上面那些客户端函数的服务器端函数；甚至， 大多数客户端函数都只是服务器端函数的等效接口。 通过SQL命令可以方便调用的是`lo_creat`, `lo_create`, `lo_unlink`， `lo_import`和 `lo_export`。 下面是一些例子：

    CREATE TABLE image (
        name            text,
        raster          oid
    );

    SELECT lo_creat(-1);       -- 返回新增的空大对象的OID

    SELECT lo_create(43213);   -- 尝试用OID 43213创建大对象

    SELECT lo_unlink(173454);  -- 删除OID为173454的大对象

    INSERT INTO image (name, raster)
        VALUES ('beautiful image', lo_import('/etc/motd'));

    INSERT INTO image (name, raster)  -- 和上面一样，但是指定要使用的OID
        VALUES ('beautiful image', lo_import('/etc/motd', 68583));

    SELECT lo_export(image.raster, '/tmp/motd') FROM image
        WHERE name = 'beautiful image';

服务器端的`lo_import`和 `lo_export`函数和客户端的那几个有着显著的不同。 这两个函数在服务器的文件系统里读写文件， 使用数据库所有者的权限进行。 因此，只有超级用户才能使用他们。相比之下，客户端的输入和输出函数在客户端的文件系统里读写文件， 使用客户端程序的权限。客户端函数不需要超级用户权限。

`lo_read`和`lo_write`的功能通过服务器端调用可用， 但是服务器端函数名不同于客户端接口，因为他们不包含下划线。你必须作为`loread`和`lowrite` 调用这些函数。

上一页 | 起始页 | 下一页
客户端接口 | 上一级 | 例子程序