Oracle中LOB 处理

来源:这里教程网 时间:2026-02-27 12:19:52 作者:

主要是用来存储大量数据的数据库字段,最大可以存储4G字节的非结构化数据。主要介绍字符类型和二进制文件类型LOB数据的存储,单独

三,大对象数据的读取和操作:dbms_lob包
   dbms_lob包:包含处理大对象的过程和函数
   /*
   insert into tlob values(1,'gene','clob大对象列',empty_blob(),bfilename('mydir','img_0210.jpg'));
   insert into tlob values(2,'jack','clob大对象列',empty_blob(),bfilename('mydir','img_0210.jpg'));
   insert into tlob values(3,'mary','大对象列clob',empty_blob(),bfilename('mydir','img_0210.jpg'));
   */
  1,读取大对象数据的过程和函数
   ①:dbms_lob.read():从lob数据中读取指定长度数据到缓冲区的过程。
      dbms_lob.read(lob数据,指定长度,起始位置,存储返回lob类型值变量);
     例子:
     declare
        varc clob;
     vrstr varchar2(1000);
        ln number(4);
        strt number(4);
     begin
        select resume into varc from tlob where no = 1;
        ln := dbms_lob.getlength(varc);
        strt := 1;
        dbms_lob.read(varc, ln, strt, vrstr);
        dbms_output.put_line('return: '||vrstr);
     end;
  
   ②:dbms_lob.substr():从lob数据中提取子字符串的函数。
    dbms_lob.substr(lob数据,指定提取长度,提取起始位置):
    例子:
     declare
       varc clob;
      vrstr varchar2(1000);
      ln number(4);
      strt number(4);
     begin
      select resume into varc from tlob where no = 1;
      ln := 4;
      strt := 1;
      vrstr := dbms_lob.substr(varc, ln, strt);
      dbms_output.put_line('结果为: '||vrstr);
     end;
   
   ③:dbms_lob.instr():从lob数据中查找子字符串位置的函数。
     dbms_lob.instr(lob数据, 子字符串);
     例子:
     declare 
      varc clob;
      vsubstr varchar2(1000);
      vrstr varchar2(1000);
      ln number(4);
     begin
      select resume into varc from tlob where no = 1;
        vsubstr := '大对象';
      ln := dbms_lob.instr(varc,vsubstr);
      dbms_output.put_line('位置为: '||ln);
     
      vrstr := dbms_lob.substr(varc, length(vsubstr), ln);
      dbms_output.put_line('位置为'||ln||'长度为'||length(vsubstr)||'的子字符串为:'||vrstr);
     end;
   
   ④:dbms_lob.getlength():返回指定lob数据的长度的函数。
     dbms_lob.getlength(lob数据);
   
   ⑤:dbms_lob.compare():比较二个大对象是否相等。返回数值0为相等,-1为不相等。
     dbms_lob.compare(lob数据,lob数据);
     例子:
     declare 
        varc1 clob;
      varc2 clob;
      varc3 clob;
      ln number(4);
     begin
      select resume into varc1 from tlob where no = 1;
      select resume into varc2 from tlob where no = 2;
      select resume into varc3 from tlob where no = 3;
      ln := dbms_lob.compare(varc1,varc1);
      dbms_output.put_line('比较的结果为: '||ln);
      ln := dbms_lob.compare(varc2,varc3);
      dbms_output.put_line('比较的结果为: '||ln);
     end;
   2,操作大对象数据的过程
    操作会改变数据库中原有数据,需要加上updata锁锁上指定数据列,修改完后提交事务。
   
   ①:dbms_lob.write():将指定数量的数据写入lob的过程。
     dbms_lob.write(被写入lob, 写入长度(指写入lob数据),写入起始位置(指被写入lob),写入lob数据);
     例子:
     declare
        varc clob;
        vwstr varchar2(1000);
        vstrt number(4);
      ln number(4);
     begin
        vwstr := 'clob';
        ln := length(vwstr);
        vstrt := 5;
        select resume into varc from tlob where no = 1 for update;
        dbms_lob.write(varc, ln, vstrt, vwstr);
        dbms_output.put_line('改写结果为: '||varc);
        commit;
     end;
   
   ②:dbms_lob.append():将指定的lob数据追加到指定的lob数据后的过程。
     dbms_lob.append(lob数据,lob数据);
     例子:
     declare
      varc clob;
      vastr varchar2(1000);
     begin
      vastr := ',这是大对象列';
      select resume into varc from tlob where no = 1 for update;
      dbms_lob.append(varc, vastr);
      commit;
      dbms_output.put_line('追加结果为: '||varc);
     end; 
   
   ③:dbms_lob.erase():删除lob数据中指定位置的部分数据的过程;
     dbms_lob.erase(lob数据,指定删除长度, 开始删除位置);
     例子:
     declare
      varc clob;
      ln number(4);
      strt number(4);
     begin
      ln := 1;
      strt := 5;
      select resume into varc from tlob where no = 1 for update;
      dbms_lob.erase(varc, ln, strt);
      commit;
      dbms_output.put_line('擦除结果为: '||varc);
     end;  
   
   ④:dbms_lob.trim():截断lob数据中从第一位置开始指定长度的部分数据的过程;
     dbms_lob.trim(lob数据,,截断长度);
     例子:
     declare
     varc clob;
     ln number(4);
     begin
      ln := 4;
      select resume into varc from tlob where no = 1 for update;
      dbms_lob.trim(varc, ln);
      commit;
      dbms_output.put_line('截断结果为: '||varc);
     end;
   
   ⑤:dbms_lob.copy():从指定位置开始将源lob复制到目标lob;
     dbms_lob.copy(源lob,目标lob,复制源lob长度,复制到目标lob开始位置,复制源lob开始位置)
     例子:
     declare 
      vdest_lob clob;
      vsrc_lob clob;
      amount number;
      dest_offset number;
      src_offset number;
     begin
      select resume into vdest_lob from tlob where no = 1 for update; 
      select resume into vsrc_lob from tlob where no = 2 ;
      
      amount := dbms_lob.getlength(vsrc_lob);
      dest_offset := dbms_lob.getlength(vdest_lob)+1;
      src_offset := 1;
      
      dbms_lob.copy(vdest_lob, vsrc_lob, amount, dest_offset, src_offset);
      dbms_output.put_line('拷贝结果为: '||vdest_lob);
     end;

相关推荐