Oracle EMPTY_BLOB() 函数使用指南
Oracle EMPTY_BLOB() 是一个内置函数,它返回一个已初始化但未包含任何二进制数据的空的 BLOB(Binary Large Object)定位器。
在 Oracle 数据库中,往 BLOB 列写入内容前,通常必须先将其初始化为非 NULL 的空定位器,才能通过 PL/SQL 过程或外部程序(Java、Python、C# 等)利用 DBMS_LOB 写入流式二进制数据。
Oracle EMPTY_BLOB() 语法
这里是 Oracle EMPTY_BLOB() 函数的语法:
EMPTY_BLOB()
参数
EMPTY_BLOB() 函数不接受任何参数。
返回值
Oracle EMPTY_BLOB() 函数返回一个空的 BLOB 定位器(LOB Locator)。
- 该定位器指向一个有效分配的 LOB 存储空间,其长度为 0 字节。
- 它与
NULL不同:EMPTY_BLOB()不是NULL,对它调用IS NULL返回FALSE,调用DBMS_LOB.GETLENGTH()返回0。
Oracle EMPTY_BLOB() 示例
这里展示了在插入记录、更新字段以及结合 PL/SQL 流式写入时 EMPTY_BLOB() 的典型用法。
基本用法:在 INSERT 时初始化 BLOB 字段
-- 创建存放文档附件的表
CREATE TABLE document_store (
doc_id NUMBER PRIMARY KEY,
doc_title VARCHAR2(100),
doc_binary BLOB
);
-- 插入一条记录,并将 doc_binary 初始化为空 BLOB
INSERT INTO document_store (doc_id, doc_title, doc_binary)
VALUES (1, '系统架构设计图.png', EMPTY_BLOB());
COMMIT;
验证字段状态与长度:
SELECT
doc_id,
doc_title,
DBMS_LOB.GETLENGTH(doc_binary) AS blob_length,
CASE WHEN doc_binary IS NULL THEN '是 NULL' ELSE '已初始化' END AS null_check
FROM document_store
WHERE doc_id = 1;
输出:
DOC_ID DOC_TITLE BLOB_LENGTH NULL_CHECK
---------- ------------------------------ ----------- ----------
1 系统架构设计图.png 0 已初始化在 PL/SQL 中锁定定位器并写入二进制数据
使用 RETURNING ... INTO 获取 EMPTY_BLOB() 分配的定位器,随后即可使用 DBMS_LOB.WRITE 写入二进制数据:
SET SERVEROUTPUT ON;
DECLARE
v_blob BLOB;
v_raw_data RAW(32767);
BEGIN
-- 插入并获取定位器
INSERT INTO document_store (doc_id, doc_title, doc_binary)
VALUES (2, 'sample_data.bin', EMPTY_BLOB())
RETURNING doc_binary INTO v_blob;
-- 构造一段 RAW 二进制数据 (十六进制 0x01020304)
v_raw_data := HEXTORAW('01020304');
-- 将数据写入 BLOB 定位器
DBMS_LOB.WRITE(v_blob, 4, 1, v_raw_data);
COMMIT;
DBMS_OUTPUT.PUT_LINE('成功写入字节数: ' || DBMS_LOB.GETLENGTH(v_blob));
END;
/
输出:
成功写入字节数: 4清空现有 BLOB 数据
如果想要清空已有 BLOB 列的数据并保留非空定位器状态,可以直接执行 UPDATE:
UPDATE document_store
SET doc_binary = EMPTY_BLOB()
WHERE doc_id = 2;
COMMIT;
结论
EMPTY_BLOB()是对二进制大对象进行操作的前提,它使定位器生效,为后续的数据流追加、写入创造条件。- 严禁将含有未初始化
NULL的 BLOB 列直接传递给需要写操作的DBMS_LOB子程序,否则会触发ORA-22275: invalid LOB locator specified异常。初始化时应始终优先使用EMPTY_BLOB()。