日期:2014-05-16 浏览次数:20563 次
<LOB分类>
??? LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。它又分为两种类型:内部LOB和外部LOB。
??? 1.内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。Oracle支持三种类型的内部LOB:
??? 1)BLOB(二进制数据)
??? 2)CLOB(单字节字符数据)
??? 3)NCLOB(多字节字符数据)。
??? 其中CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频等。
??? 2.目前只支持一种外部LOB类型,即BFILE类型。在数据库内,该类型仅存储数据在操作系统中的位置信息,而数据的实体以外部文件的形式存在于操作系统的文件系统中。因而,该类型所表示的数据是只读的,不参与事务。
??? 该类型可帮助用户管理大量的由外部程序访问的文件。
<LOB存储方式>
??? LOB由两部分组成:数据(值)和指向数据的指针(定位器)。尽管值与表自身一起存储,但是一个LOB列并不包含值,仅有它的定位指针。更进一步,为了使用大对象,程序必须声明定位器类型的本地变量。
当内部LOB被创建时,定位器被存放在列中,值被存放在LOB段中,LOB段是在数据库内部表的一部分。
当BFILE被创建时,定位器如同平常一样存储在列中,但是它的值被存储在数据库之外的操作系统文件中。
<LOB 的PL/SQL 调用>
在Oracle中,存储在LOB中数据称为LOB的值,如使用Select ? 对某一LOB字段进行选择,则返回的不是LOB的值,而是该LOB字段的定位器(可以理解为指向LOB值的指针)。
而要对某一LOB的值进行访问和维护操作,必需通过其定位器来进行。DBMS_LOB包中提供的所有函数和过程都以LOB定位器作为参数:
APPEND()?????????????????????将源LOB中的内容加到目的LOB中?????
COPY()???????????????????????? 从源LOB中复制数据到目的LOB?????
ERASE()???????????????????????删除LOB中全部或部分内容?????
TRIM()?????????????????????????? 将LOB值减少到指定的长度?????
WRITE()????????????????????????向LOB ? 中写入数据?????
COMPARE()??????????????????比较两个同种数据类型的LOB的部分或全部值是否相同?????
GETLENGTH()???????????????获取LOB的长度?????
READ()???????????????????????? 从LOB中读出数据
-- 创建测试表
CREATE TABLE J_LOB_TEST(
lob_id NUMBER(3),????
pictures_lob BLOB DEFAULT empty_blob(),????
text_lob CLOB DEFAULT empty_clob(),????
media_file BFILE DEFAULT NULL,????
CONSTRAINTS PK_J_LOB_TEST_ID? PRIMARY KEY(lob_id)????
)
-- 写数据
DECLARE
? lobloc CLOB;
? buffer VARCHAR2(2000);
? amount NUMBER := 3;
? offset NUMBER := 2;
BEGIN
? insert into J_LOB_TEST (lob_id, text_lob) values (100, 'abcdefg');
? SELECT text_lob
??? INTO lobloc --获取定位器????
??? FROM J_LOB_TEST
?? WHERE lob_id = 100;
? dbms_lob.read(lobloc, amount, offset, buffer); --读取数据到缓冲区????
? dbms_output.put_line(buffer); --显示缓冲区中的数据?
END;
?
转自:http://solecjj.blogbus.com/logs/19497504.html