ORACLE学习笔记(七)——DBMS_LOB包的学习和使用

一、LOB写入测试:

          建表:clob_test(id,position_clob,strain_clob);

create or replace PROCEDURE CLOB_WRITE_TEXT AS
V_CLOB CLOB;
BEGIN
  --★(1)★遇到大对象列的时候,要首先插入空白构造函数
  insert into clob_test(id,position_clob,strain_clob) values(id_seq.nextval,empty_clob(),empty_clob();
  --得到clob的指针,并存放在变量v_clob中,这里要加上for update之句,
  --表示事务的开始,否则dbms_lob.open 的执行会产生错误
  select position_clob into V_CLOB from clob_test where id='1' 
  for update;
  --★(2)★根据clob指针以读写方式打开clob
  dbms_lob.open(v_clob,dbms_lob.lob_readwrite);
  --★(3)★然后就是写入数据了,格式:DBMS_LOB.Write(被写入LOB, 写入长度(指写入LOB数据),写入起始位置(指被写入LOB),写入LOB数据);  
  --往lob中写入字符mis,3表示被写的字符数量,1表示开始写的位置,下面的语句表示字符串中只有3个字符被写入lob中 
  dbms_lob.write(v_clob,3,1,'mis');
  --★注:这里还有一个函数要注意,writeappend:将缓冲区的数据追加到lob的末尾;
  --格式:DBMS_LOB.WRITEAPPEND(lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB, 
  --                          amount IN BINARY_INTEGER,  
  --                          buffer IN RAW/VARCHAR2
  --                         ); 
  --下面的语句表示字符串中只有前20个字符被追加写入到了v_clob中
  dbms_lob.writeappend(v_clob,20,'shtgfsvgsdfrnyerergbfghgl.,mnbgaewbtnmgigynbrdfgi,ommnsbcdsfb');
  --★(4)★最后关闭lob指针
  dbms_lob.close(v_clob);
  --提交修改
  commit;
  exception
  when others then
  --出现错误,提示失败
  dbms_output.put_line('失败!');
      rollback;
END CLOB_WRITE_TEXT;

 

二、LOB读取测试

 

          对一中的表中的clob类型的列的数据做读取操作:

create or replace PROCEDURE CLOB_READ_TEXT AS
  --定义把数据读取出来的clob变量
  pclob CLOB;
  sclob CLOB;
  read_id number;
  p_out varchar2(32767);
  s_out varchar2(32767);
  p_read_lenth number;
  s_read_lenth number;
begin
  --获得一个lob locator
  select POSITION_CLOB into pclob from clob_test where id = '1';
  select STRAIN_CLOB into sclob from clob_test where id = '1';
  --将要读取lob整个长度的字符
  p_read_lenth :=LENGTH(pclob);
  s_read_lenth :=LENGTH(sclob);
  --★读取lob数据,格式如下★
  --DBMS_LOB.READ(lob_loc IN BLOB/CLOB/BFILE,     -- LOB 数据
  --              amount IN OUT NOCOPY BINARY_INTEGER,    -- IN:要读取的字符数;OUT:实际读取的字符数  
  --              offset IN INTEGER,      --  起始位置  
  --              buffer   OUT  RAW/VARCHAR2    -— 存储返回数据的变量
  --              );
  --下面的 1 表示从第一个字符开始读取,读取的字符放在变量x_out中
  dbms_lob.read(pclob,p_read_lenth,1,p_out);
  dbms_lob.read(sclob,s_read_lenth,1,s_out);
  --显示读取的结果
  --select id into read_id from clob_test;
  dbms_output.put_line('当前的id值:'||read_id);
  dbms_output.put_line('position的clob字符串:'||p_out);
  dbms_output.put_line('长度为:'|| length(p_out));
  dbms_output.put_line('strain的clob字符串:'||s_out);
  dbms_output.put_line('长度为:'|| length(s_out));
end CLOB_READ_TEXT;

 

三、LOB截取测试

 

          对一中的clob_test表中的clob类型的列的数据做读取操作:

create or replace PROCEDURE CLOB_SUBSTR_TEXT(p_out_array out array.filename_array ) AS 
  v_amount INT;
  v_offset INT;
  pclob CLOB;
  p_read_lenth number;
  p_out varchar2(32767);
  v_clob1 varchar2(32767);
  str1 varchar2(32767);
  l_LEN integer;
  i integer;
BEGIN
  --数组初始化
  p_out_array := array.filename_array(); 
  --数组扩展到10000个元素
  p_out_array.extend(10000); 
  select POSITION_CLOB into pclob from clob_test where id = '2';
  p_read_lenth :=LENGTH(pclob);
  --p_out为输出的源串
  dbms_lob.read(pclob,p_read_lenth,1,p_out);
  --以逗号为分隔符截取字符串
  str1 := ','||p_out||',';
  --计算出有几个“,”(数字)
  l_len := length(Translate(str1, ',0123456789 ', ','));
  FOR i IN 1..l_len-1 LOOP
    --把数字都放数组里
    SELECT substr(str1,instr(str1,',',1,i)+1 ,instr(str1,',',1,i+1)-instr(str1,',',1,i)-1 ) 
      INTO p_out_array(i) FROM dual;
    --dbms_output.put_line(t(i));
  END loop;
  --使用 隐式游标 判断数组的数据是否有效,当有数据返回时候该属性为TRUE
  if sql%found then 
    --打印数组
    dbms_output.put_line('游标打开!数组数据写入成功!如下:');
    FOR i IN 1..l_len-1 LOOP
      dbms_output.put_line(p_out_array(i));
    END loop;
  else
    dbms_output.put_line('游标未打开!');
  end if;
  --★截取clob部份字符串★ 注意substr是一个函数而不是一个存储过程,不修改clob变量的值,格式如下:
  --DBMS_LOB.SUBSTR(lob_loc  IN  BLOB/CLOB/BFILE,   -- 提取的来源  
  --                amount   IN  INTEGER:=32762,   -- 提取长度  
  --                offset   IN  INTEGER:=1   -- 开始位置  
  --               )RETURN  RAW/VARCHAR2;   -- 提取到的内容
  v_amount:=11;  --截取长度
  v_offset:=1;    --开始截位置
  --截取v_amount长度的字符串赋值给v_clob1
  v_clob1 := dbms_lob.substr(p_out,v_amount,v_offset);
  dbms_output.put_line(v_clob1);
EXCEPTION
  WHEN TOO_MANY_ROWS THEN
  DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS');
  WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('others unknown errors !');
END CLOB_SUBSTR_TEXT;

 

 

 

四、LOB其他函数——后续再抽时间补上

 

 

 

部分参考资料:https://blog.csdn.net/guoxilen/article/details/73470586

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值