Oracle EMPTY_CLOB() 函数使用指南
Oracle EMPTY_CLOB() 是一个内置函数,它返回一个已初始化但未包含任何字符数据的空的 CLOB(Character Large Object)定位器。
在 Oracle 中,VARCHAR2 字段的最大长度限制为 4,000 字节(扩展模式下为 32,767 字节)。当需要存储更大容量的文本(如富文本内容、日志、大型 JSON 或 XML 报文)时,必须使用 CLOB 数据类型。在向 CLOB 写入大文本流之前,通常使用 EMPTY_CLOB() 为该列初始化一个有效的定位器。
Oracle EMPTY_CLOB() 语法
这里是 Oracle EMPTY_CLOB() 函数的语法:
EMPTY_CLOB()
参数
EMPTY_CLOB() 函数不接受任何参数。
返回值
Oracle EMPTY_CLOB() 函数返回一个空的 CLOB 定位器(LOB Locator)。
- 返回的定位器长度为 0 个字符(或 0 字节)。
- 该定位器非
NULL,对它进行IS NULL比较时为FALSE。
Oracle EMPTY_CLOB() 示例
这里展示了在插入记录、默认值定义以及结合 PL/SQL 写入文本时的典型应用。
基本用法:在表定义中使用默认值或 INSERT 初始化
-- 创建文章正文存储表
CREATE TABLE articles (
article_id NUMBER PRIMARY KEY,
title VARCHAR2(200) NOT NULL,
content_clob CLOB DEFAULT EMPTY_CLOB()
);
-- 插入一条记录,利用默认值或显式指定 EMPTY_CLOB()
INSERT INTO articles (article_id, title, content_clob)
VALUES (1001, '深入理解 Oracle LOB 存储架构', EMPTY_CLOB());
COMMIT;
验证字段状态:
SELECT
article_id,
title,
DBMS_LOB.GETLENGTH(content_clob) AS clob_char_count,
CASE WHEN content_clob IS NULL THEN '是 NULL' ELSE '非 NULL' END AS status
FROM articles
WHERE article_id = 1001;
输出:
ARTICLE_ID TITLE CLOB_CHAR_COUNT STATUS
---------- ------------------------------------ --------------- ----------
1001 深入理解 Oracle LOB 存储架构 0 非 NULL在 PL/SQL 中使用 RETURNING INTO 向 CLOB 追加文本
在将长文本流写入数据库时,典型模式是先插入 EMPTY_CLOB(),随后使用 RETURNING ... INTO 获取其定位器并使用 DBMS_LOB.WRITEAPPEND 写入内容:
SET SERVEROUTPUT ON;
DECLARE
v_clob CLOB;
v_text VARCHAR2(4000);
BEGIN
INSERT INTO articles (article_id, title, content_clob)
VALUES (1002, '分布式数据库设计与实战', EMPTY_CLOB())
RETURNING content_clob INTO v_clob;
v_text := '第一章:分布式事务与两阶段提交协议详解。';
DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_text), v_text);
v_text := '第二章:Raft 共识机制与高可用架构。';
DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_text), v_text);
COMMIT;
DBMS_OUTPUT.PUT_LINE('成功写入 CLOB,总字符数: ' || DBMS_LOB.GETLENGTH(v_clob));
END;
/
输出:
成功写入 CLOB,总字符数: 41清空大文本字段
与直接将字段赋值为 NULL 相比,赋予 EMPTY_CLOB() 可以保持行内 LOB 描述符的存在,避免后续修改时产生额外行迁移:
UPDATE articles
SET content_clob = EMPTY_CLOB()
WHERE article_id = 1002;
COMMIT;
结论
EMPTY_CLOB()用于初始化字符大对象(CLOB/NCLOB),返回有效但长度为 0 的定位器。- 对未初始化的
NULLCLOB 字段调用DBMS_LOB读取或写入子程序会抛出ORA-22275错误,因此在数据导入前始终推荐使用EMPTY_CLOB()初始化。