当前位置:操作系统 > Unix/Linux >>

oracle的字段类型

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。
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,