主要是用来存储大量数据的数据库字段,最大可以存储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;