oracle的clob赋值_oracle 临时clob 和永久clob 的读取操作详解

首先认识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 列进行操作即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值