首先认识clob操作的相关函数
dbms_lob.getlength(v_clob) = 0 then ---length() 函数判断clob的字符数 量dbms_lob.createtemporary(v_clob,true); ---创建临时clobdbms_lob.substr(v_clob1); ----截取clob,不传参数就是全部读取 ,dbms_lob.append(v_clob1,'9999999999999'); ---向clob 后追加 ,会影响源 clob 列 即数据库的数据dbms_lob.freetemporary(v_clob); --释放clobdbms_lob.open(v_clob1,dbms_lob.lob_readwrite); ---打开clobdbms_lob.write(v_clob1,v_length,1,v_str); --如果源数据列有数据那么会替换 掉源dbms_lob.writeappend(v_clob1,v_length,v_str); ---直接往数据后面追加dbms_lob.append(v_clob1,'9999999999999'); ---向clob 后追加 ,会影响源clob 列 即数据库的数据dbms_lob.close(v_clob1); --关闭clobdbms_lob.istemporary(v_clob) ---判断一个clob变量是临时clob 还是永久clob
-- 情况1: 基于表的 clob 列的数据进行数据的处理,不影响原表数据(clob列的数据)
declare
v_clob clob := empty_clob(); --初始化clob ,此时clob 不为空,只是其指针指向的内容是空的
v_str varchar2(100);
v_str2 varchar2(100);
v_length number;
v_length2 number;
v_clob1 clob;
begin
--判断clob 是否为空
if v_clob is null then
dbms_output.put_line('v_clob is null');
else
dbms_output.put_line('v_clob is not null');
end if;
-- 返回: v_clob is not null
--是其指针指向的内容是空的
if dbms_lob.getlength(v_clob) = 0 then
---length() 函数判断clob的字符数量
dbms_output.put_line('length is 0');
else
dbms_output.put_line('length is not 0');
end if;
--返回: length is 0
dbms_lob.createtemporary(v_clob, true); ---创建临时clob
dbms_output.put_line(dbms_lob.istemporary(v_clob)); --判断是临时clob 还是永久clob (1:表示临时; 0:表示永久)
---此时的v_clob1 是永久clob ,对他的操作会改变源数据列的内容
select t.response
into v_clob1
from fnd_https_post_request t
where t.request_id = 448;
dbms_output.put_line(v_clob);
--将永久clob 的数据赋值给 临时clob ,不改变临时定位符的指针,只改变他执行的内容
v_clob := dbms_lob.substr(v_clob1); ----截取clob,不传参数就是全部读取 ,
dbms_lob.append(v_clob,
'注意,尽管这个函数返回值是真(1)或者假(0),但并不是布尔数据类型');
dbms_output.put_line(dbms_lob.istemporary(v_clob));
dbms_output.put_line(v_clob);
dbms_lob.freetemporary(v_clob); --释放clob
-- 一般来说创建clob 和释放clob 是必不可少的
end;
-- 情况2: 对变量的处理影响原表clob列的数据
declare
v_clob clob := empty_clob();
v_str varchar2(100);
v_str2 varchar2(100);
v_length number;
v_length2 number;
v_clob1 clob;
begin
dbms_output.put_line(dbms_lob.istemporary(v_clob));
select t.response into v_clob1 from fnd_https_post_request t
where t.request_id = 448 for update nowait; --对表的clob列数据的操作必须锁表
dbms_output.put_line(v_clob1);
--原数据: {"batchNum":"20200621113025","responseStatus":"SUCCESS"}
dbms_lob.open(v_clob1,dbms_lob.lob_readwrite); ---打开clob
dbms_output.put_line(dbms_lob.istemporary(v_clob));
v_str := '添加的数据1';
--获取字符串的字符数
v_length := length(v_str);
dbms_lob.write(v_clob1,v_length,1,v_str); --如果源数据列有数据那么会替换掉源数据从1 - 该字符串的位置的数据 ,如果没有则新增
v_str := '添加的据2';
v_length := length(v_str);
dbms_lob.writeappend(v_clob1,v_length,v_str); ---直接往数据后面追加
dbms_lob.append(v_clob1,'9999999999999'); ---向clob 后追加 ,会影响源clob列 即数据库的数据
dbms_output.put_line(v_clob1);
--添加的数据1hNum":"20200621113025","responseStatus":"SUCCESS"}添加的据29999999999999
dbms_lob.close(v_clob1); --关闭clob
---经过处理之后 此时数据库clob 列的数据和v_clob1 的数据一样 ,即他们的定位符(指针)指向同一份数据
end;
总结:如果各位只是想获取表clob列的数据,对这些数据进行处理,不改变表clob的数据的话就使用上述情景1 的方案,创建一个临时clob再去对数据做处理,相反如果需要对表clob 列的数据进行操作,那么就不需要创建临时clob,可以直接通过open()函数对表的clob 列进行操作即可。