资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
在 oracle 中,有 4 个大对象(lobs)类型可用,分别是 blob,clob,bfile,nclob。下面是对 lob 数据类型的简单介绍。blob:二进制 lob,为二进制数据,最长可达 4GB,存贮在数据库中。clob:字符 lob,字符数据,最长可以达到 4GB,存贮在数据库中。bfile:二进制文件;存贮在数据库之外的只读型二进制数据,最大长度由操作系统限制。nclob:支持对字节字符集合(nultibyte characterset)的一个 clob 列。对于如何检索和操作这些 lob 数据一直是 oracle 数据库开发者经常碰到的问题。下面我将在 oracle 对 lob 数据处理的一些方法和技巧,介绍给读者,希望能够对读者以后的开发有所帮助。Blob and Clob ORACLE 中的大对象: LONG: 可变长的字符串数据,最长2G,LONG 具有 VARCHAR2 列的特性,可以存储长文本一个表中最多一个 LONG 列 LONG RAW: 可变长二进制数据,最长 2G CLOB: 字符大对象 Clob 用来存储单字节的字符数据 NCLOB: 用来存储多字节的字符数据 BLOB: 用于存储二进制数据 BFILE: 存储在文件中的二进制数据,这个文件中的数据只能被只读访。但该文件不包含在数据库内。bfile 字段实际的文件存储在文件系统中,字段中存储的是文件定位指针 .bfile 对 oracle 来说是只读的,也不参与事务性控制和数据恢复 . CLOB,NCLOB ,BLOB 都是内部的LOB(Large Object)类型,最长 4G,没有 LONG 只能有一列的限制。要保存图片、文本文件、Word 文件各自最好用哪种数据类型?-BLOB 最好,LONGRAW 也不错,但 Long是 oracle 将要废弃的类型,因此建议用 BLOB。对 CLOB 与 BLOB 对象的操作 1. 查询(GET) 查询 CLOB oracle 中可以用多种方法来检索或操作 lob 数据。通常的处理方法是通过 dbms_lob 包。其他的方法包括使用 api(application programminginterfaces)应用程序接口和oci(oracle call interface)oracle 调用接口程序。一、在 oracle 开发环境中我们可以用 dbms_lob 包来处理!dbms_lob 包功能强大,简单应用。既可以用来读取内部的 lob 对象,也可以用来处理 bfile 对象。但处理两者之间,还有一点差别。处理内部 lob 对象(blob,clob)时,可以进行读和写,但处理外部 lob 对象 bfile 时,只能进行读操作,写的操作可以用 pl/sql 处理。另外用 sql 也可以处理 lob,但要注意 sql 仅可以处理整个 lob,不能操作 lob 的数据片。在 dbms_lob 包中内建了 read(),append,write(),erase(),copy(),getlength(),substr()等函数,可以很方便地操作 lob 对象。这里不做深入讨论,读者可以参看相关的书籍。对于 pl/sql,下面介绍一种技巧,用动态的 pl/sql 语句处理 clob 对象来传替表名!example 1.动态 PL/SQL,对 CLOB 字段操作可传递表名 table_name,表的唯一标志字段名field_id,clob 字段名 field_name 记录号 v_id,开始处理字符的位置 v_pos,传入的字符串变量 v_clob修改 CLOB 的 PL/SQL 过程:updateclobcreate or replace procedure updateclob( table_name in varchar2,field_id in varchar2,field_name in varchar2,v_id in number,v_pos in number,v_clob in varchar2)islobloc clob;c_clob varchar2(32767);amt binary_integer;pos binary_integer;query_str varchar2(1000);beginpos:=v_pos*32766+1;amt := length(v_clob);c_clob:=v_clob;query_str :=select |field_name|from |table_name|where |field_id|= :id for update ;-initialize buffer with data to be inserted or updatedEXECUTE IMMEDIATE query_str INTO lobloc USING v_id;-from pos position, write 32766 varchar2 into loblocdbms_lob.write(lobloc, amt, pos, c_clob);commit;exceptionwhen others thenrollback;end;l /用法说明:在插入或修改以前,先把其它字段插入或修改,CLOB 字段设置为空 empty_clob(),然后调用以上的过程插入大于 2048 到 32766 个字符。如果需要插入大于 32767 个字符,编一个循环即可解决问题。查询 CLOB 的 PL/SQL 函数:getclobcreate or replace function getclob(table_name in varchar2,field_id in varchar2,field_name in varchar2,v_id in number,v_pos in number) return varchar2islobloc clob;buffer varchar2(32767);amount number := 2000;offset number := 1; query_str varchar2(1000);beginquery_str :=select |field_name| from |table_name|where |field_id|= :id ;-initialize buffer with data to be foundEXECUTE IMMEDIATE query_str INTO lobloc USING v_id;offset:=offset+(v_pos-1)*2000;-read 2000 varchar2 from the bufferdbms_lob.read(lobloc,amount,offset,buffer);return buffer;exceptionwhen no_data_found thenreturn buffer;end;l 用法说明:用 select getclob(table_name,field_id,field_name,v_id,v_pos) aspartstr from dual;可以从 CLOB 字段中取 2000 个字符到 partstr 中,编一个循环可以把 partstr 组合成 dbms_lob.getlength(field_name)长度的目标字符串。二、对于在其他不同的开发环境,例如 vc,vb,pb,java 等环境下对 lob 的处理,处理方法不尽相同,在这里将简要举几个例子来说明不在 oracle 开发环境下对 lob 的处理。(一) 在 pb 中的处理exampler 2.string ls_path,ls_filename,ls_jhdhlong ll_num,ll_count,rtnblob ole_blobll_num=dw_lb.getrow()if ll_num0 then ls_jhdh=dw_lb.object.ct_njhdhll_numselect count(*) into :ll_count from sj_jh_jhfjb wherect_jhdlxbh=1 and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;if ll_count0 thenrtn=messagebox(提示,是否要修改此附件,question!,yesno!,1)if rtn=1 thenSELECTBLOB ct_jhfjnr INTO le_blob from sj_jh_jhfjb wherect_jhdlxbh=1 and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;ole_1.objectdata =ole_blobIf ole_1.activate(offsite!) ThenCall FileToBlob(rs.Fields(text), ComDlgDir.filename)rs.UpdateEnd IfSet rs = NothingExit SubSet rs = NothingEnd SubPrivate Sub Form_Load()If Not CreateDataSource(sid, systemp, manager) ThenMsgBox Connection failure!End IfEnd Subfld As ADODB.Field, filename As String, Optional ChunkSize AsLong = 8192)Dim fnum As Integer, bytesleft As Long, bytes As LongDim tmp() As ByteIf (fld.Attributes And adFldLong) = 0 ThenErr.Raise 1001, , field doesnt support the GetChunk method. End IfIf Dir$(filename) = Then Err.Raise 53, , File not foundfnum = FreeFileOpen filename For Binary As fnumbytesleft = LOF(fnum)Do While bytesleftbytes = bytesleftIf bytes ChunkSize Then bytes = ChunkSizeReDim tmp(1 To bytes) As ByteGet fnum, , tmpfld.AppendChunk tmpbytesleft = bytesleft - bytesLoopClose #fnumEnd SubSub BlobToFile(fld As ADODB.Field, filename Abinary_double 双精度 64 位binary_float 双精度 32 位blob,clob,nclob 三种大型对象(LOB),用来保存较大的图形文件或带格式的文本文件,如 Miceosoft Word 文档,以及音频、视频等非文本文件,最大长度是 4GB。LOB 有几种类型,取决于你使用的字节的类型,Oracle 8i 实实在在地将这些数据存储在数据库内部保存。可以执行读取、存储、写入等特殊操作。 interval day to second,interval year to month 类型存储两个 TIMESTAMP 之间的时间差异,秒,月long 可变长字符列,最大长度限制是 2GB,用于不需要作字符串搜索的长串数据,如果要进行
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号