↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 7.0 / 6.5 / 6.4 / 6.3
历史版本PostgreSQL 7.0 已于 2005 年 5 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

51.3. 接口

下面描述 Postgres 提供的访问大对象的设施,既包括后端中作为用户自定义函数一部分的用法,也包括前端中作为使用该接口的应用一部分的用法。对于熟悉 Postgres 4.2 的用户来说, PostgreSQL 有一套新函数,提供了更连贯的接口。

注意

所有对大对象的操作必须在一个 SQL 事务中进行。这一要求从 Postgres v6.5 起被严格执行,尽管在之前的版本中它一直是隐含的要求,忽略它会导致错误行为。

Postgres 的大对象接口模仿 Unix 文件系统接口设计,有与 open(2)、read(2)、 write(2)、 lseek(2) 等对应的函数。用户函数调用这些例程来只从大对象中检索感兴趣的数据。例如,假设存在一个存储面孔照片的名为 mugshot 的大对象类型,那么可以在 mugshot 数据上声明一个名为 beard 的函数。Beard 可以查看照片的下三分之一部分,并确定那里出现的胡须颜色(如果有的话)。整个大对象的值不需要被 beard 函数缓冲,甚至不需要被检查。 大对象可以从动态装载的 C 函数或链接了该库的数据库客户端程序访问。Postgres 提供了一组支持打开、读取、写入、关闭和在大对象上定位的例程。

51.3.1. 创建一个大对象

例程

Oid lo_creat(PGconn *conn, int mode)

创建一个新的大对象。 mode 是一个位掩码,描述新大对象的若干不同属性。这里列出的符号常量定义在 $PGROOT/src/backend/libpq/libpq-fs.h 中。访问类型(读、写或读写)由把 INV_READ 和 INV_WRITE 位"或"在一起来控制。如果大对象应当被归档——也就是说,如果它的历史版本应当被定期移到一个特殊的归档关系中——那么应当设置 INV_ARCHIVE 位。掩码的低十六位是大对象应驻留的存储管理器编号。对于伯克利以外的站点,这些位应当始终为零。下面的命令创建一个(Inversion)大对象:

inv_oid = lo_creat(INV_READ|INV_WRITE|INV_ARCHIVE);
     

51.3.2. 导入一个大对象

要把一个 UNIX 文件导入为大对象,调用

Oid lo_import(PGconn *conn, const char *filename)

filename 指定要导入为大对象的文件的 Unix 路径名。

51.3.3. 导出一个大对象

要把一个大对象导出到 UNIX 文件,调用

int lo_export(PGconn *conn, Oid lobjId, const char *filename)

lobjId 参数指定要导出的大对象的 Oid,filename 参数指定文件的 UNIX 路径名。

51.3.4. 打开一个现有的大对象

要打开一个现有的大对象,调用

int lo_open(PGconn *conn, Oid lobjId, int mode)

lobjId 参数指定要打开的大对象的 Oid。mode 位控制对象是以读 INV_READ)、写还是读写方式打开。 大对象在创建之前无法打开。 lo_open 返回一个大对象描述符,供稍后在 lo_read、lo_write、 lo_lseek、lo_tell 和 lo_close 中使用。

51.3.5. 向大对象写入数据

例程

int lo_write(PGconn *conn, int fd, const char *buf, size_t len)

把 len 字节从 buf 写入大对象 fd。fd 参数必须是先前某个 lo_open 返回的。返回值是实际写入的字节数。发生错误时,返回值为负。

51.3.6. 从大对象读取数据

例程

int lo_read(PGconn *conn, int fd, char *buf, size_t len)

从大对象 fd 中读取 len 字节到 byf。fd 参数必须是先前某个 lo_open 返回的。返回值是实际读取的字节数。发生错误时,返回值为负。

51.3.7. 在大对象上定位

要更改大对象上当前的读或写位置,调用

int lo_lseek(PGconn *conn, int fd, int offset, int whence)

此例程把 fd 所描述大对象的当前位置指针移动到 offset 指定的新位置。whence 的有效值是 SEEK_SET、SEEK_CUR 和 SEEK_END。

51.3.8. 关闭一个大对象描述符

可以通过调用下面的函数来关闭一个大对象:

int lo_close(PGconn *conn, int fd)

其中 fd 是由 lo_open 返回的大对象描述符。成功时 lo_close 返回零。发生错误时,返回值为负。

51.3.9. 移除一个大对象

要从数据库中移除一个大对象,调用

Oid lo_unlink(PGconn *conn, Oid lobjId)

lobjId 参数指定要删除的大对象的 Oid。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。