oracle中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段是在数据库内部表的一部分。
当BFILE被创建时,定位器如同平常一样存储在列中,但是它的值被存储在数据库之外的操作系统文件中。

在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


你可能感兴趣的:(数据库)