`
liujianguangaaa
  • 浏览: 235092 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

oracle LOB介绍

阅读更多

LARGE OBJECT   
ORACLE8中有4种LOB  
- BLOB:Binary Large Object  
- CLOB:Character Large Object  
- NCLOB:固定长度的多字节Character Large Object  
- BFILE:DB外部的二进制文件  
它们分为两类:  
内部LOB:存放在DB内部,包括BLOB,CLOB,BCLOB  
外部文件:存放在DB外面,就是BFILE  

要注意的是ORACLE8不自动转换这些类型的数据。  

1、LONG和LOB的比较  
LONG/LONG RAW LOB  
--------------------------------------------------  
表中只能由一个列 可以有多列  
最大2G 最大4G  
SELECT返回值 SELECT返回指针  
存放在DB内 可以在DB的内或者外  
不支持OBJECT类型 支持  
顺序存取 随机存取  
--------------------------------------------------  

NCLOB不支持OBJECT类型  
LOB小于4000字节时是内部存放  

2、LOB解析  
LOB有两个不同的部分  
- LOB值:LOB代表的数据  
- LOB指针:LOB存放数据的位置  
LOB列内部不存放数据,而是LOB值的位置。当创建内部LOB时,值存放在LOB SEGMENT中,指向OUT-OF-LIN数据的指针放在列中。对外部LOB,只在列中存放位置。  

3、内部LOB  
就是存放在DB内部的LOB,包括BLOB,CLOB,NCLOB。它们可以是  
用户自定义的类型中的属性  
表中某列  
SQL 变量  
程序host变量  
PL/SQL中的变量、参数、返回值  

内部LOB可以使用ORACLE的并发机制、REDO LOG、RECOVERY机制。  
BLOB被ORACLE8解释为二进制位流,类似LONG RAW。  
CLOB解释为单字节字符流  
NCLOB是固定的多字节字符流,基于DB NATIONAL字符集的字节长度。  

例子:  
CREATE TYPE picture_typ AS OBJECT (image BLOB);  

CREATE TABLE person_tab  
( pname VARCHAR2(20),  
  RESUME CLOB,  
  picture picture_typ  
);  

上面的语句完成后,数据将存放在5个物理SEGMENT中。  
- TABLE person_tab在缺省TABLESPACE,  
- RESUME存放的LOB SEGMENT   
- PICTURE存放的LOB SEGMENT  
- 标示RESUME存放位置的LOB INDEX SEGMENT  
- 标示PICTURE存放位置的LOB INDEX SEGMENT  
LOB INDEX是隐式创建的。  

当INSERT或者OBJECT CACHE中的OBJECT刷新到SERVER时,LOB生成。可以使用DBMS_LOB包和OCI来处理LOB。当ROW删除时,相应的内部LOB也会删除。UPDATE必须处理整个LOB值,不能UPDATE其中的一部分。  

4、内部LOB的存储参数  
具体语法可以参见ORACLE文档,  
LOB ( lob项,...) STORE AS lob_segment_name   
CHUNK integer  
PCTVERSION integer  
CACHE  
NOCACHE LOGGING/NOLOGGING  
TABLESPACE tablespace_name  
STORAGE storage子句  
INDEX INDEX字句  

lob_segment_name:缺省式LOB$n  
CHUNK:连续分配在一起的BLOCK数目,存放连续的LOB数据。这些CHUNK的数据存放在LOB INDEX里面,使用内部LOB标示和LOB值作为键。  
PCTVERSION:LOB一致读需要的系统空间。一旦LOB申请超过PCTVERSION的值,ORACLE就会收旧的空间并REUSE之。  
CACHE:使用SGA区的DB BUFFER CACHE处理LOB的READ/WRITE。  
NOCACHE LOGGING:不使用SGA区的BUFFER,数据的改变纪录到REDO LOG。  
  存取LOB比较频繁时,使用CACHE  
    存取LOB不频繁时,使用NOCACHE  
NOCACHE NOLOGGING:不使用SGA区的BUFFER和REDO LOG  
   
INDEX子句  
INDEX  lob_index_segtment_name   
INITTRANS integer  
MAXTRANS integer  
TABLESPACE tablespace_name  
STORAGE storage子句  

如果没有设置LOB存储参数和INDEX STROAGE,则采用如下缺省值  
CHUNK=1 DB_BLOCK  
PCTVERSION=10  
NOCACHE  
NOLOGGING  

例子:  
CREATE TABLE APARTMENTS (   
floor_plan BLOB,  
contract  CLOB,  
name VARCHAR2(10))  
LOB (floor_plan, contract)STORAGE AS(  
STORAGE (INITIAL 100K NEXT 100K PCTINCREASE 0)  
CHUNK 10  
PCTVERSION 20  
NOCACHE  
NOLOGGING  
INDEX (INITIAL 100K NEXT 100K)  
);  

5、内部LOB的并发  
LOB的读一致和其他ORACLE类型一样,但是它是在CHUNK级别上作VERSION的。  

6、外部LOB  
ORACLE8允许定义BFILE类型,可以把外部文件和BFILE对象连接起来,同时能提供BFILE的安全机制。  
BFILE对处理不需要transaction控制的OS文件很有用处。  
对BFILE的处理需要DBMS_LOB或者OCI。  
BFILE必须是READ-ONLY的,文件应该放在ORACLE能存取的地方。如果删除BFILE对象,外部文件并不删除。  
例子:  
CREATE TABLE home_page(  
EMPLOYEE REF EMPLOYEE_TYP,  
LAST_UPDATE DATE,  
HOMEPAGE BFILE);  

CREATE TYPE personal_info_typ AS OBJECT   
( EMPLOYEE REF employee_typ,  
PICTURE BFILE,  
THUMBPRINT BFILE,  
REINAPRINT BFILE  
);  

其实在BFILE对应的列或者属性中存放的是BFILE的位置,即是物理文件的位置。  
读BFILE不通过SGA.  

7、BFILE的安全  
ORACLE8提供安全机制。文件必须和DB在一台机器上,读取不存在文件的timeout由os决定。可以和内部LOB的读取方法一致,但是必须注意:文件的权限、文件系统空间限制、其他对文件的维护、OS允许的最大文件大小。  
ORACLE8不对BFILE采取TRANSACTION的支持,ORACLE的BACKUO和RECOVERY也不支持BFILE。  


8、目录DIRECTORY  
这是ORACLE为了管理BFILE引入的新元素,它指定SERVER文件系统的目录,可以把文件系统的目录抽象为数据库对象,更具有灵活性。  
DIRECTORY由DBA建立,系统用户拥有,通过GRANT/REVOKE来确定哪些用户有权限。  

CREATE OR REPLACE DIRECTORY 目录名 AS 路径名  
DROP DIRECTORY 目录名  

存取BFILE在如下情况时候产生异常:  
-用户没有操作DIRECTORY的权限  
-DIRECTORY所对应的物理目录不存在,或者没有存取该目录的权限。  
-文件不存在  

文件和权限的检查是在文件存取时候检查的,创建时候并不报错。  
不支持逻辑路径  

系统新增加了CREATE ANY DIRECTORY和DROP  ANY DIRECTORY。对DIRECTORY授权只有READ。  

对CREATE DIRECTORY和GRANT READ ON DIRECTORY是可以AUDIT的。  

8、DIRECTORY建立的原则  
DIRECTORY不要和DB DATAFILE在相同的目录下。  
要有选择的赋予CREATE ANY DIRECTORY和DROP ANY DIRECTORY ROLE。  
在建立之前要在OS级别上设置权限。  
如果移植DB到其他机器,需要注意DIRECTORY的路径是否改变。  

9、管理LOB  
ORACLE 通类似文件操作一样的接口:DBMS_LOB, OCI8。同时还有SQL语句的一些支持。  
管理LOB的一般方法:  
1)CREATE/POPULATE 包含LOB的TABLE,  
2)在程序中DECLARE AND INITIALIZE LOB Locator  
3)用SELECT FOR UPDATE 锁定包含LOB的ROW,  
4)用DBMS_LOB或者OCI维护相关LOB值  
5)COMMIT  

管理BFILE的一般方法  
1)建立OS目录,授予ORACLE 用户READ的权限  
2)把文件放到该目录  
3)建立包含BFILE的TABLE  
4)建立DIRECTORY,用GRANT授权  
5)在TABLE中INSERT与文件相关的值  
6)在程序中声明LOB Locator  
7)取得包含LOB Locator的行  
8)用DBMS_LOB和OCI读取BFILE  

10、LOB的操作  
可以用SQL、PL/SQL、3GL中嵌入式SQL或者OCI中的变量值直接INSERT 到LOB中。  

可以用其他的LOB、NULL或者EMPTY_CLOB()/EMPTY_BLOB()的值UPDATE LOB。当把一个LOB赋给另一个时,其实是新建了一个LOB。这些操作不需要SELECT FOR UPDATE。只有在更新LOB的其中一部分的时候才需要先LOCK。  
ORACLE8不会自动转换CLOB和BLOB。  
最好的办法是OCILobWrite,以为它使用ORACLE的流机制,最快、使用更好的空间和REDO。  

删除LOB的方法  
DELETE ....  
TRUNCATE TABLE....  
DROP TABLE ...  
删除后注意在OS级别上删除相关文件。  
如果只是要去掉LOB的Locator,可以用NULL或者空字符串''来UPDATE。  

11、DBMS_LOB包  
DBMS_LOB包用SYS用户提交DBMSLOB.SQL和PRVTLOB.PLB脚本。它们包含在CATPROC.SQL中。用户要授权才能使用它。匿名BLOCK中的DBMS_LOB例程使用当前用户的权限。STORED PROCEDURE中的DBMS_LOB调用使用其所有者的权限。  
它不支持BFILE的并发控制机制。  
你必须控制LOB的LOCK,DBMS_LOB不会隐式的LOCK LOB所在的ROW。  
DBMS_LOB.LOBMAXSIZE = 4G  

包含两类操作  
1)APPEND、COPY, EARSE,TRIM,WRITE,FILECLOSE,FILECLOSEALL,FILEOPEN,LOADFROMFILE  
2)COMPARE,FILEGETNAME.INSTR,GETLENGTH,READ,SUBSTR,FILEEXISTS,FILEISOPEN  

DBMS_LOB的任何参数为NULL,则返回值为NULL.  
如果目标LOB/BFILE=NULL,将触发异常。  
BLOB/BFILE的OFFSET以BYTE为单位,CLOB/NCLOB以字符为单位。且不能为负值,否则会触发异常。缺省OFFSET为1。  
参数不能为负值。  

PROCEDURE APPEND(DEST_LOB, SRC_LOB);  
把一个LOB加到另一个LOB中。  
FUNCTION COMPARE(L1, L2, AMOUNT, OFFSET1,OFFSET2)  
  =0  ,相同  
=-1,第一个小  
=1,第一个大  

12、系统管理方面的问题  
EXPORT/IMPORT支持LIBRARY和DIRECTORY,支持LOB。  
IMPORT转换EXPORT文件中的CLOB到当前缺省的字符集。NCLOB转换到当前Nationanl字符集。BLOB不转换。  
BFILE不能EXP/IMP。只有BFILE的名字和DIRECTORY被EXPORT出来。

分享到:
评论

相关推荐

    Oracle LOB 详解

    Oracle LOB 详解 Oracle LOB(Large OBject)是一种复杂的数据类型,用于存储大型二进制数据,如图像、音频、视频等。 Oracle LOB 详解涵盖了 LOB 的基本概念、创建、存储、维护等方面,旨在帮助开发者和数据库...

    Oracle LOB字段处理工具

    Oracle数据库系统中,LOB(Large Object)字段是用来存储大量数据的类型,如图像、音频、视频或大型文本文件。在数据库操作中,LOB字段的处理往往比常规的行数据更为复杂,因为它涉及到大块的数据读取、写入和管理。...

    Oracle数据库中LOB的调优.pdf

    Oracle数据库中LOB的调优 Oracle数据库中的LOB(Large OBject)是一种特殊的数据类型,用于存储大量的二进制数据或字符数据。LOB数据类型包括BLOB、CLOB、NCLOB和BFILE四种,分别用于存储二进制数据、字符数据、...

    Oracle Lob Performance Guidelines

    本文档将基于提供的描述和部分内容,详细介绍如何针对 Oracle LOB 进行性能调优。 #### LOB 类型概述 LOB(大型对象)类型用于存储大量的文本或二进制数据。Oracle 支持四种 LOB 类型:`CLOB`、`NCLOB`、`BLOB` 和...

    ORACLE LOB大对象处理.doc

    通过上述介绍,我们可以看到,在Oracle数据库中,LOB数据类型的使用非常灵活且强大,能够有效支持大量数据的存储和管理需求。无论是处理文本还是多媒体文件,LOB都为用户提供了一种高效的方法来存储和访问这些大型...

    ORACLE LOB大对象处理

    Oracle数据库中的LOB(Large Object)类型是用来存储大量数据的,如文本、图像、音频或视频等。LOBs分为四种类型:BLOB(Binary Large Object)用于二进制数据,CLOB(Character Large Object)用于字符数据,NCLOB...

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    oracle dbms_lob

    Oracle数据库系统中,`DBMS_LOB`是一个重要的PL/SQL包,专门用于处理大型对象(LOBs,Large Object)。LOBs是Oracle提供的一种数据类型,用于存储大量数据,如文本、图像、音频或视频文件等。这个包包含了各种过程和...

    使用JDBC数据接口存取Oracle LOB(大对象).pdf

    首先,文章介绍了Oracle LOB的背景。随着互联网的快速发展和业务需求的多样化,处理非结构化数据变得日益重要。传统的数据库管理模式难以应对这类数据的存储和管理,因此Oracle引入了LOB(Large Object)数据类型,...

    基于VC的Oracle LOB数据库访问技术.pdf

    【基于VC的Oracle LOB数据库访问技术】 Oracle数据库是一个广泛使用的高性能关系型数据库系统,尤其在处理大量非结构化数据时表现出色。LOB(Large Object)数据类型是Oracle为存储大尺寸非结构化数据如图像、音频...

    Spring+Hibernate处理Oracle lob字段(一)

    在本文中,我们将深入探讨如何在Java环境下,利用Spring和Hibernate框架处理Oracle数据库中的LOB(Large Object)字段。LOB字段通常用于存储大体积的数据,如文本、图片或视频。在实际开发中,处理这类数据时可能会...

    基于.NET的Oracle LOB数据库访问技术.pdf

    【基于.NET的Oracle LOB数据库访问技术】 Oracle数据库在存储和管理大对象非结构化数据方面扮演了重要角色,特别是其LOB(Large Object)数据类型,包括BLOB(Binary Large Object)和CLOB(Character Large Object...

    ORACLELOB大对象处理[定义].pdf

    Oracle中的LOB(Large Object)是用于存储大量非结构化数据的数据类型,如文本、图像、音频或视频等。LOBs分为两大类:字符类型和二进制类型。 1. 字符类型: - CLOB(Character Large Object):用于存储单字节...

    用PHP操纵Oracle的LOB类型的数据

    在Oracle数据库中,当需要存储超过VARCHAR2类型最大限制(4000个字符或2000个汉字)的数据时,可以使用LOB(Large Object)类型,包括BLOB(Binary Large OBject)、CLOB(Character Large OBject)以及BFILE。...

    地震前兆Oracle LOB数据压缩与交换及其访问效率研究.pdf

    本篇文章主要探讨了Oracle数据库中Large OBject(LOB)数据的压缩、交换以及访问效率问题。由于在地震前兆监测领域,数据库存储了大量的观测数据,通常这些数据具有体积庞大、增速快的特点,因此存储和处理这些数据...

    Oracle中LOB字段的存储管理和优化.pdf

    本文将详细介绍 Oracle 中 LOB 字段的存储结构、存储参数和存储方式,并讨论 LOB 字段的优化策略。 LOB 字段的存储结构 ------------- LOB 字段由三个部分组成:LOB 列、LOB 数据段和 LOB 索引段。LOB 列是指向 ...

    Oracle更改表空间(table、index、lob)

    本文将详细介绍如何通过SQL命令来更改表空间中的表(table)、索引(index)以及大对象(lob)。 #### 一、更改表空间中的表(Table) 当需要将某个表移动到另一个表空间时,可以使用以下步骤: 1. **查询当前表所在的表...

    lob字段数据删除空间测试.txt

    测试oracle数据库中,lob字段在不同参数条件下,删除数据后占用空间的情况。 测试1 测试disable storage in row下的lob字段 测试2 测试非disable storage in row模式下 该模式为默认模式,既小于4k的数据不会存在lob...

    ODI LOB 类型KM

    在给定的压缩包文件中,我们有两个与LOB(Large Object)类型相关的Knowledge Modules(KM),它们是KM_IKM Oracle Incremental UpdateLOB.xml和KM_LKM SQL to SQL LOB (JYTHON).xml。 首先,让我们详细了解一下LOB...

Global site tag (gtag.js) - Google Analytics