Oracle存储过程向CLOB字段内嵌追加换行符失效问题求解
问题根因
你在存储过程中使用||拼接CLOB的写法,会直接覆盖从表查询得到的绑定真实数据行的LOB定位器,生成一个仅存在于会话内存中的临时LOB副本。后续dbms_lob.writeappend操作的只是这个临时副本,完全不会回写到数据库表中,因此会出现换行符没加、追加数据也不生效的现象。
修复方案
不要用||拼接换行符,直接调用dbms_lob.writeappend追加换行符即可,操作全程复用从表中查询到的LOB定位器,改动会自动同步到表数据:
create or replace procedure lob_append( p_id in number, p_text in varchar2 ) as l_clob clob; begin select c into l_clob from t where seq_num = p_id for update; -- 用writeappend追加换行符,操作原LOB定位器 dbms_lob.writeappend( l_clob, 1, chr(10) ); -- 再追加传入的文本 dbms_lob.writeappend( l_clob, length(p_text), p_text ); end; /
补充说明
- 从表中
select ... for update得到的LOB定位器是和对应数据行绑定的,直接用dbms_lob包的方法操作这个定位器,改动会直接写入表,不需要额外执行UPDATE语句。 - 只有对绑定了表数据的定位器做的操作才会持久化,赋值生成的临时LOB定位器的所有改动都不会落库。
内容的提问来源于stack exchange,提问作者Pugzly
相关产品推荐
相关产品推荐

