ORACLE LOB大对象处理
主要是用来存储大量数据的数据库字段,最大可以存储128T字节的非结构化数据。
主要介绍字符类型和二进制文件类型LOB数据的存储,单独介绍二进制类型LOB数据的存储。
一.Oracle中的LOB数据类型分类
BLOB: 二进制lob,为二进制数据,最长可达4GB,存贮在数据库中
CLOB: 字符lob,字符数据,最长可以达到4GB,存贮在数据库中。
BFILE: 二进制文件;存贮在数据库之外的只读型二进制数据,最大长度由操作系统限制。
NCLOB: 支持对字节字符集合(nultibyte characterset)的一个clob列.
ORACLE中对Lob数据类型的DML操作,都包含在dbms_lob包。
二 介绍一下关于DBMS_LOB包的四组方法:
1. LOB的I/O操作:Append,READ,WRITE,EARSE,OPEN,CLOSE
2. COVERTTOCLOB/COVERTTOBLOB
3. LOADFROMFILE/LOADBLOBFROMFILE/LOADCLOBFROMFILE
4. COMPARE,COPY,INSTR,SUBSTR,GETLENGTH,GETCHUNKSIZE,GET_STORAGE_LIMIT
下面做了一个实例:
/* 从CLOB中读取一行数据,
注: 本函数处理3类换行:ascii码为 1310, 10, 13 */
*/
function F_READ_LINE_FROM_CLOB
(
clobLoc in CLOB, /*传入的CLOB对象*/
nOffset in out number /*起始偏移位置,第一次使用时为“1”,
函数调用后自动移到下一行的起始位置,若
输出偏移量大于CLOB长度,表示已经结束*/
)
return varchar2
/*读取到的数据*/
is
nPos number(10);
nPos_13 number(10);
sLine varchar2(8192):=null;/*最大行长*/
nLineSize integer;
nLobLength number;
M_step integer:=1; /*换行的长度默认为1*/
begin
nLobLength:=dbms_lob.getlength(clobLoc);/*判断长度*/
if(nLobLength<nOffset) then
return sLine;/*若偏移量大于长度,结束*/
end if;
nPos :=dbms_lob.instr(clobLoc,chr(10),nOffset,1);/*定位换行符位置*/
if(nPos>0) then /*找到换行*/
/*-----处理 1310 和 10 两种情况----*/
/*若chr(10)的前一个符号是chr(13),则跳过该符号*/
if(nLobLength>=nOffset) then
if(DBMS_LOB.SUBSTR(clobLoc,1,nPos-1)=chr(13)) then
nPos :=nPos-1;
m_step:=2;
end if;
end if;
nLineSize:=nPos-nOffset; /*获取本行长度*/
if(nLineSize>0) then /*若长度非零,则读取,放入sLine中*/
dbms_lob.read(clobLoc,nLineSize,nOffset,sLine);
end if;
nOffset:=nPos+m_step; /*定位下次的偏移量位置*/
m_step :=1; /*换行的长度默认为1*/
else /*未找到回车符号,则读取剩下的数据*/
nPos_13 :=dbms_lob.instr(clobLoc,chr(13),nOffset,1);/*定位换行符位置*/
if (nPos_13>0) then
/*-----处理 13 情况----*/
nLineSize:=nPos_13-nOffset;/*获取本行长度*/
if(nLineSize>0) then /*若长度非零,则读取,放入sLine中*/
dbms_lob.read(clobLoc,nLineSize,nOffset,sLine);
end if;
nOffset:=nPos_13+m_step; /*定位下次的偏移量位置*/
else
nLineSize:=nLobLength-nOffset+1;
if(nLineSize>0 and nLineSize<=8192) then
dbms_lob.read(clobLoc,nLineSize,nOffset,sLine);
end if;
nOffset:=nLobLength+1;
end if;
end if;
return (sLine); /*返回数据*/
end;
|
|