OracleDBMS_LOB包提供标准化函数处理BLOB、CLOB、BFILE等大对象,包含获取长度、打开、读写、追加、截断、复制、创建临时LOB及BFILE操作等,使用需遵循打开-读写-关闭规范,是数据库处理大对象的核心工具。
Oracle DBMS_LOB函数用法说明
时间:2026-06-06
浏览:290
文章目录
在 Oracle 数据库中,处理大对象(LOB)是日常开发中的常见任务。无论是 BLOB、CLOB、BFILE 还是 NCLOB,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 包中最常用的一组函数。实际使用时,请遵循“打开—读写—关闭”的规范,尤其是处理大文件时,顺序正确基本不会出错。如果对某个函数的具体行为有疑问,建议先在测试环境中验证,并结合文档确认参数含义。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。