Oracle存储过程实现向CLOB字段前缀插入带SYSDATE标签内容咨询
Oracle CLOB头部插入带时间标签内容的存储过程实现
实现思路
需要把带时间标签的新内容插入到原有CLOB最前面时,直接用字符串拼接操作在CLOB体积较大时会有性能和长度限制问题,因此基于DBMS_LOB包的原生操作实现,兼容大CLOB场景,同时和你原有lob_append的调用逻辑、标签格式保持完全兼容。
存储过程代码
CREATE OR REPLACE PROCEDURE lob_prepend( p_clob IN OUT CLOB, p_text IN VARCHAR2 ) AS l_new_prefix VARCHAR2(32760); l_date_string VARCHAR2(50); l_original_clob CLOB; BEGIN -- 生成时间标签,格式和原有逻辑一致 SELECT '[' || TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') || ']' INTO l_date_string FROM dual; -- 组装带时间标签和换行的前缀内容 l_new_prefix := CHR(10) || l_date_string || CHR(10) || p_text || CHR(10) || l_date_string || CHR(10); -- 暂存原CLOB内容 l_original_clob := p_clob; -- 清空原CLOB,先写入新前缀 DBMS_LOB.TRIM(p_clob, 0); DBMS_LOB.WRITEAPPEND(p_clob, LENGTH(l_new_prefix), l_new_prefix); -- 把原CLOB内容追加到新前缀后面,完成头部插入 DBMS_LOB.WRITEAPPEND(p_clob, DBMS_LOB.GETLENGTH(l_original_clob), l_original_clob); END; /
调用示例
调用方式和你原有lob_append完全一致,仅需要替换存储过程名即可:
DECLARE l_clob CLOB := empty_clob(); BEGIN SELECT c INTO l_clob FROM t WHERE seq_num = 1 FOR UPDATE; -- 内容将插入到CLOB最头部 lob_prepend(l_clob, RPAD('A',20,'A')); COMMIT; END; /
调用完成后查询CLOB内容,新插入的带时间标签内容会出现在原有所有内容的最前面,和你提供的UPDATE语句逻辑完全一致。
内容的提问来源于stack exchange,提问作者Pugzly
相关产品推荐
相关产品推荐

