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

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