Oracle DBMS_LOB函数用法说明

作者:技术拾光时间:2026-06-06 08:46:02浏览:293

OracleDBMS_LOB包提供标准化函数处理BLOB、CLOB、BFILE等大对象,包含获取长度、打开、读写、追加、截断、复制、创建临时LOB及BFILE操作等,使用需遵循打开-读写-关闭规范,是数据库处理大对象的核心工具。

在 Oracle 数据库中,处理大对象(LOB)是日常开发中的常见任务。无论是 BLOB、CLOB、BFILE 还是 NCLOB,DBMS_LOB 包都提供了一套标准化的函数,用于读写、复制、比较以及清理这些数据。以下逐一拆解最常用的函数,帮助开发者快速掌握核心用法。

Oracle DBMS_LOB函数用法说明

  • BFILE:文件存储在数据库外部,数据库仅记录路径别名,类似指针。
  • BLOB:文件内容实际存放在数据库中,通常需借助 BFILE 将外部文件导入。

1. GETLENGTH

获取指定 LOB 字段的字节数或字符数。统计长度时必备。

DBMS_LOB.GETLENGTH(lob_loc  IN  BLOB/CLOB/BFILE/NCLOB) RETURN  INTEGER;

2. OPEN

打开 LOB 对象以准备读写。必须指定打开模式:只读或读写。

DBMS_LOB.OPEN(
    lob_loc    IN  OUT  NOCOPY  BLOB/CLOB/BFILE,
    open_mode  IN  BINARY_INTEGER
    -- 只读: DBMS_LOB.LOB_READONLY;读写: DBMS_LOB.LOB_READWRITE
);

3. READ

从 LOB 中读取指定长度的数据,放入缓冲区。amount 参数既指定要读取的数量,也会返回实际读取的数量。

DBMS_LOB.READ(
    lob_loc  IN  BLOB/CLOB/BFILE,
    amount   IN  OUT  NOCOPY  BINARY_INTEGER,
    offset   IN  INTEGER,
    buffer   OUT  RAW/VARCHAR2
);

4. WRITE

将缓冲区中的数据写入 LOB 的指定位置。常用于更新大对象中的某段内容。

DBMS_LOB.WRITE(
    lob_loc  IN  OUT  NOCOPY  BLOB/CLOB,
    amount   IN  BINARY_INTEGER,
    offset   IN  INTEGER,
    buffer   IN  RAW/VARCHAR2
);

5. APPEND

将一个 LOB 追加到另一个 LOB 的末尾,免去手动计算偏移的麻烦。

DBMS_LOB.APPEND(
    dest_lob  IN  OUT  NOCOPY  BLOB,
    src_lob   IN  BLOB
);

6. WRITEAPPEND

直接向 LOB 尾部写入缓冲区数据,比先读后写更加便捷。

DBMS_LOB.WRITEAPPEND(
    lob_loc  IN  OUT  NOCOPY  BLOB/CLOB/NCLOB,
    amount   IN  BINARY_INTEGER,
    buffer   IN  RAW/VARCHAR2
);

7. TRIM

将 LOB 截断至指定长度。例如只需要前 100 个字节,多余部分直接丢弃。

DBMS_LOB.TRIM(
    lob_loc  IN  OUT  NOCOPY  BLOB/CLOB/NCLOB,
    newlen   IN  INTEGER
);

8. CLOSE

打开后务必关闭,否则占用资源。

DBMS_LOB.CLOSE(lob_loc  IN  OUT  NOCOPY  BLOB/CLOB/BFILE);

9. SUBSTR

从 LOB 中截取一段子串。与普通字符串的 substr 类似,但操作对象是大对象。

DBMS_LOB.SUBSTR(
    lob_loc  IN  BLOB/CLOB/BFILE,
    amount   IN  INTEGER := 32762,
    offset   IN  INTEGER := 1
) RETURN RAW/VARCHAR2;

10. INSTR

在 LOB 中查找某个模式出现的位置。类似于字符串的 instr,但能处理大对象。

DBMS_LOB.INSTR(
    lob_loc  IN  BLOB/CLOB/NCLOB/BFILE,
    pattern  IN  RAW/VARCHAR2,
    offset   IN  INTEGER := 1,
    nth      IN  INTEGER := 1
) RETURN INTEGER;

11. COMPARE

比较两个大对象是否完全相同。返回 0 表示相等,-1 表示不等。

DBMS_LOB.COMPARE(
    lob_1       IN  BLOB/CLOB/BFILE,
    lob_2       IN  BLOB/CLOB/BFILE,
    amount      IN  INTEGER := 4294967295,
    offset_1    IN  INTEGER := 1,
    offset_2    IN  INTEGER := 1
);

12. ERASE

擦除 LOB 中指定位置的内容,实际效果是将该段数据清空。

DBMS_LOB.ERASE(
    lob_loc  IN  OUT  NOCOPY  BLOB/CLOB/NCLOB,
    amount   IN  OUT  NOCOPY  INTEGER,
    offset   IN  INTEGER := 1
);

13. COPY

从一个 LOB 复制一段数据到另一个 LOB。可指定源和目标偏移量。

DBMS_LOB.COPY(
    dest_lob     IN  OUT  NOCOPY  BLOB/CLOB/NCLOB,
    src_lob      IN  BLOB/CLOB/NCLOB,
    amount       IN  INTEGER,
    dest_offset  IN  INTEGER := 1,
    src_offset   IN  INTEGER := 1
);

14. CREATETEMPORARY

在临时表空间中创建临时 LOB,用完后需释放。适合中间计算场景。

DBMS_LOB.CREATETEMPORARY(
    lob_loc  IN  OUT  NOCOPY  BLOB/CLOB/NCLOB,
    cache    IN  BOOLEAN,
    dur      IN  PLS_INTEGER := 10
);

15. ISTEMPORARY

判断 LOB 定位符是否指向临时 LOB。

DBMS_LOB.ISTEMPORARY(lob_loc  IN  BLOB/CLOB/NCLOB) RETURN INTEGER;

16. FILEEXISTS

检查 BFILE 指向的操作系统文件是否存在。返回 1 表示存在,0 表示不存在。

DBMS_LOB.FILEEXISTS(file_loc  IN  BFILE) RETURN INTEGER;

17. FILEGETNAME

从 BFILE 定位符中提取目录别名和文件名。调试时非常有用。

DBMS_LOB.FILEGETNAME(
    file_loc    IN  BFILE,
    dir_alias   OUT  VARCHAR2,
    filename    OUT  VARCHAR2
);

18. FILEISOPEN

判断 BFILE 对应的文件是否已经打开。

DBMS_LOB.FILEISOPEN(file_loc  IN  BFILE) RETURN INTEGER;

19. FREETEMPORARY

释放临时 LOB 占用的资源。若 CREATETEMPORARY 后忘记释放,临时表空间容易撑爆。

DBMS_LOB.FREETEMPORARY(lob_loc  IN  OUT  NOCOPY  BLOB/CLOB/NCLOB);

20. FILEOPEN

打开 BFILE 文件,准备读取内容。

DBMS_LOB.FILEOPEN(
    file_loc   IN  OUT  NOCOPY  BFILE,
    open_mode  IN  BINARY_INTEGER := FILE_READONLY
);

21. LOADBLOBFROMFILE

将 BFILE 中的数据加载到 BLOB 中。同时返回加载后的偏移量,便于分片加载。

DBMS_LOB.LOADBLOBFROMFILE(
    dest_loc     IN  OUT  NOCOPY  BLOB,
    src_bfile    IN  BFILE,
    amount       IN  INTEGER,
    dest_offset  IN  OUT  INTEGER,
    src_offset   IN  OUT  INTEGER
);

22. FILECLOSE

关闭单个 BFILE 文件。

DBMS_LOB.FILECLOSE(FILE_LOC  IN  OUT  NOCOPY  BFILE);

23. FILECLOSEALL

一次性关闭当前会话中所有已打开的 BFILE 文件。出现异常时可用此方法收尾。

DBMS_LOB.FILECLOSEALL();

以上涵盖了 DBMS_LOB 包中最常用的一组函数。实际使用时,请遵循“打开—读写—关闭”的规范,尤其是处理大文件时,顺序正确基本不会出错。如果对某个函数的具体行为有疑问,建议先在测试环境中验证,并结合文档确认参数含义。