oralce names server 简介

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 13:49:10
0、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出来。

Tags:

作者:佚名
分享到: 微信 更多

相关文章

  • oralce names server 简介