一个简单的Oracle LOB例子

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;
标签: 暂无标签
oraunix

写了 199 篇文章,拥有财富 1026,被 339 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

成为第一个吐槽的人

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈