本文整理自网络,侵删。
目录
- 一、LOB数据类型分类
- 1、按存储数据的类型分
- 2、按存储方式分
- 3、Null LOBs与Empty LOBs
- 二、LOB写入
- 三、LOB读取
- 四、BFile文件大对象(存储在操作系统文件中的数据)
- 1. 创建
- 2. 读取
- 五、将文件系统数据库通过BFile导入到LOB字段中
- 六、C#读写Oracle BOLB数据。
- (1)写入数据到Orable Blob字段中。
- (2)读取Oracle Blob到文件中。
一、LOB数据类型分类
1、按存储数据的类型分
- 字符类型:
CLOB:存储大量 单字节 字符数据。
NLOB:存储定宽 多字节 字符数据。 - 二进制类型:
BLOB:存储较大无结构的二进制数据。 - 二进制文件类型:
BFILE:将二进制文件存储在数据库外部的操作系统文件中。存放文件路径。
2、按存储方式分
- 存储在内部表空间:
CLOB,NLOB和BLOB - 指向外部操作系统文件:
BFILE
3、Null LOBs与Empty LOBs
DECLARE some_clob CLOB; BEGIN IF some_clob IS NULL THEN dbms_output.put_line('a'); --NULL 表示该 LOB 字段或变量中连 LOB 指针都没有 ELSIF dbms_lob.getlength(some_clob) = 0 THEN dbms_output.put_line('b'); --empty LOB 是指该 LOB 字段或变量中保存了一个 LOB 指针,但这个指针并没有指向任何 LOB 数据 ELSE dbms_output.put_line('c'); --指针有实际内容 END IF; END;
二、LOB写入
Blob数据不能象其它类型数据一样直接插入(INSERT)。插入前必须先插入一个空的Blob对象,BLOB类型的空对象为EMPTY_BLOB(),之后通过SELECT命令查询得到先前插入的记录并锁定,继而将空对象修改为所要插入的Blob对象。
当获取到一个可用的 LOB 指针(定位器)后,就可以通过该指针写入 LOB 数据了。有两种写入数据的系统函数:
- DBMS_LOB.WRITE :将数据随机地写入 LOB 中。
- DBMS_LOB.WRITEAPPEND :从 LOB 的最后开始写入数据。
运用dbms_lob包用dbms_lob.write()写入只能存储32k以下的图片。
注意:这里并不需要使用 UPDATE 来更新列 falls_myclob,因为这个 LOB 指针并没有发生变化,我们只是将数据写入它所指向的位置。
declare myclob clob; amount binary_integer; offset integer; first_direction varchar2(100); more_myclob varchar2(500); begin --删除所有“munining Falls”的现有行,然后 delete from waterfalls where falls_name = 'Munising Falls'; insert into waterfalls (falls_name, falls_myclob) values ('Munising Falls', EMPTY_CLOB()); --使用EMPTY_CLOB()插入新行来创建LOB定位器 select falls_myclob into myclob from waterfalls where falls_name = 'Munising Falls'; --检索由前面的INSERT语句创建的LOB定位器 --或直接 INSERT into waterfalls(falls_name, falls_myclob) values('Munising Falls' EMPTY_CLOB()); returning falls_myclob into myclob; DBMS_LOB.OPEN(myclob, DBMS_LOB.LOB_READWRITE); --打开LOB;不是严格必要的,但是最好打开/关闭lob。 first_direction := 'Follow I-75 across the Mackinac Bridge.'; amount := LENGTH(first_direction); --要写的字符数 offset := 1; --开始写CLOB的第一个字符 DBMS_LOB.WRITE(myclob, amount, offset, first_direction); --使用DBMS_LOB。开始写 more_myclob := ' Take US-2 west from St. Ignace to Blaney Park.' || ' From Seney, take M-28 west to Munising.'; --使用DBMS_LOB.WRITEAPPEND添加更多的myclob DBMS_LOB.WRITEAPPEND(myclob, LENGTH(more_myclob), more_myclob); more_myclob := ' In front of the paper mill, turn right on H-58.' || ' Sand Point Road.'; --添加更多的myclob DBMS_LOB.WRITEAPPEND(myclob, LENGTH(more_myclob), more_myclob); DBMS_LOB.CLOSE(myclob); --关闭LOB,就完成了。 end;
三、LOB读取
使用系统函数 DBMS_LOB.READ( ) 来读取 LOB 中的数据,当然,首先要得到这个 LOB 指针。比如读取 CLOB 数据,应该指定字符串的偏移量(offset),从指定的偏移量的位置开始读取数据。
CLOB 的第一个字符的偏移量是1;也需要指定读取的字符串长度。如果这个 CLOB 数据太大,应该多次读取数据。对于 BLOB 数据,也是这样处理,唯一的区别就是它是按字节存储的。
DBMS_LOB.READ 中的第二个参数 chars_read_1,是 IN OUT 参数。
调用时按照该参数指定的长度来读取数据,读取完毕后,将其更新为实际读取的字符(字节)长度。
当读取后,该参数的值比你原来的值小,则说明已经读取到 LOB 的末尾了。
declare myclob clob; myclob_1 varchar2(300); myclob_2 varchar2(300); chars_read_1 binary_integer; chars_read_2 binary_integer; offset integer; begin select falls_myclob into myclob from waterfalls where falls_name = 'Munising Falls'; --检索之前插入的LOB定位器 offset := 1; --从第一个字符开始阅读 chars_read_1 := 229; --尝试读取myclob的229个字符时,chars_read_1将使用实际读取的字符数进行更新 DBMS_LOB.READ(myclob, chars_read_1, offset, myclob_1); if chars_read_1 = 229 then --如果读取229个字符,则更新偏移量并尝试读取255个字符。 offset := offset + chars_read_1; chars_read_2 := 255; DBMS_LOB.READ(myclob, chars_read_2, offset, myclob_2); else chars_read_2 := 0; myclob_2 := ''; end if; DBMS_OUTPUT.PUT_LINE('Characters read = ' || TO_CHAR(chars_read_1 + chars_read_2)); --显示读取的字符总数 DBMS_OUTPUT.PUT_LINE(myclob_1); --显示myclob DBMS_OUTPUT.PUT_LINE(myclob_2); end;
四、BFile文件大对象(存储在操作系统文件中的数据)
PL/SQL中的Bfile只能读取Bfile数据,而不能写入。
相关阅读 >>
处理oracle监听程序当前无法识别连接描述符中请求的服务异常(ora-12514)
centos 6.4下安装oracle 11gr2详细步骤(多图)
更多相关阅读请进入《oracle》频道 >>

数据库系统概念 第6版
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » Oracle中大对象(LOB)处理方法
相关推荐
评论
管理员已关闭评论功能...