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()。