oracle常用数据类型

1、Char

定长格式字符串,在数据库中存储时不足位数填补空格,它的声明方式如下CHAR(L),L为字符串长度,
缺省为1,作为变量最大32767个字符,作为数据存储在ORACLE8中最大为2000。不建议使用,会带来不
必要的麻烦

a、字符串比较的时候,如果不注意(char不足位补空格)会带来错误

b、字符串比较的时候,如果用trim函数,这样该字段上的索引就失效(有时候会带来严重性能问题)

c、浪费存储空间(无法精准计算未来存储大小,只能留有足够的空间;字符串的长度就是其所占用空间的大小)

2、Varchar2/varchar

目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留
以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中
varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。

不定长格式字符串,它的声明方式如下VARCHAR2(L),L为字符串长度,没有缺省值,作为变量最大32767个字节,
作为数据存储在ORACLE8中最大为4000。在多字节语言环境中,实际存储的字符个数可能小于L值,例如:当语言
环境为中文(SIMPLIFIED CHINESE_CHINA.ZHS16GBK)时,一个VARCHAR2(200)的数据列可以保存200个英文字符或者
100个汉字字符;对于4000字节以内的字符串,建议都用该类型

a。VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。

b。VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。不过区别也不是太大,如果就是想用varchar2,那么在发生行迁移,可以通过pctfree来调整,然后对表的数据进行重组

nchar,nvarchar/nvarchar2国家字符集,与环境变量NLS指定的语言集密切相关

只有要用到unicode时才会用到这些国家字符集,nchar和nvarchar2依据所选的字符集来存储数据,可能一个字符占两个或多个字节,防止乱码

3、Long/long raw

Oracle已经废弃,只是为了向下兼容保留着,应该全部升级到lob

LONG,在数据库存储中可以用来保存高达2G的数据,作为变量,可以表示一个最大长度为32760字节的可变字符串
LONG RAW,类似于LONG,作为数据库列最大存储2G字节的数据,作为变量最大32760字节。

Long类型有很多限制

a、表中只能有一列long类型

b、Long类型不支持分布式事务

c、太多的查询不能在long上使用了

4. 行,包括RAW和LONG RAW两种类型。用来存储二进制数据,不会在字符集间转换

RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。
LONG RAW,类似于LONG,作为数据库列最大存储2G字节的数据,作为变量最大32760字节。
行标识,只有一种类型--ROWID,用来存储“行标识符”,可以利用ROWIDTOCHAR函数来将行标识转换成为字符。

5、Date

Date类型是一个7字节的定长数据类型(从世纪到秒),绝对没有“千年虫”问题。

举个例子:性能a>b>c

a、Where date_colum>=to_date(’01-jan-2007’,’dd-mon-yyyy’)
     and date_colum< to_date(’02-jan-2007’,’dd-mon-yyyy’)

b、Where trunc(date_colum,’y’)=to_date(’01-jan-2007’,’dd-mon-yyyy’)

c、Where to_char(date_colum,’yyyy’)=’2007’

6、 Timestamp

ORACLE已经在DATE数据类型上扩展出来了TIMESTAMP数据类型,它包括了所有DATE数据类型的年月日时分秒的信息,
而且包括了小数秒的信息。如果你想把DATE类型转换成TIMESTAMP类型,就使用CAST 函数

语法Timestamp(n),n指定秒的小数位数,取值范围0~9。缺省是6。

select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss.ff8') from dual

TO_CHAR(SYSTIMESTAMP,'YYYY-MM-
2010-03-03 20:18:21.31974900

这是因为显示格式是按照参数NLS_TIMESTAMP_FORMAT定的缺省格式显示。

说明:

1)当你把一个表中date类型字段的数据移到另一个表的timestamp类型字段中去的时候,可以直接写INSERT SELECT语句, oracle会自动为你做转换的。

2) to_char函数支持date和timestamp,但是trunc却不支持TIMESTAMP数据类型

a。把DATE类型转换成TIMESTAMP类型

SQL> select cast(sysdate as timestamp) from dual;

CAST(SYSDATEASTIMESTAMP)
--------------------------------------------------------------------------------
03-3月 -10 08.25.31.000000 下午

正如你看到的,在转换后的时间段尾部有了一段“.000000”。这是因为从date转换过来的时候,没有小数秒的信息,缺省为0

b. 为了得到系统时间,返回成date数据类型。你可以使用sysdate函数。

SQL> select sysdate from dual;

SYSDATE
-----------
2010-3-3 20

c. 为了得到系统时间,返回成timestamp数据类型。你可以使用systimpstamp函数。

SQL> select systimestamp from dual;

SYSTIMESTAMP
--------------------------------------------------------------------------------
03-3月 -10 08.27.41.114314 下午 +08:00

d. 你可以设置初始化参数FIXED_DATE指定sysdate函数返回一个固定值。这用在测试日期和时间敏感的代码。注意,这个参数对于systimestamp函数无效。

SQL> alter system set fixed_date ='2006-01-01-10:00:00';

System altered

SQL> select sysdate from dual;

SYSDATE
-----------
2006-1-1 10

SQL> select sysdate from dual;

SYSDATE
-----------
2006-1-1 10

SQL> select systimestamp from dual;

SYSTIMESTAMP
--------------------------------------------------------------------------------
03-3月 -10 08.31.12.665055 下午 +08:00

e. 参数fixed_date恢复默认值

SQL> alter system set fixed_date=none;

System altered

SQL> select sysdate from dual;

SYSDATE
-----------
2010-3-3 20

8. Number

定义Number的方法:Number(p,s) ;其中p,s都是可选的:

p代表精度,默认为38

s代表小数位数,取值范围-84~127,默认取值要看是否指定了p,如果制定了p,默认s为0,如果没有指定p,默认取最大值。

几个例子:

a、 Number(5,0)=Number(5) 取值范围99999~-99999

b、 Number(5,2) 取值范围999.99~-999.99

注意:其中的整数位数只有3位,小数位数有2位,按照如下方法计算:

整数位数<=p-s

小数位数<=s

如果插入123.555存储在数据库中变成123.56 (在小数的第三位上四舍五入),如果插入999.999,数据库就要抛错。

c、 Number(5,-2) 取值范围9999900~-9999900 (整数位数<=p-s,没有小数位数)

如果插入9999949存储在数据库中变成9999900(在整数的第二位上四舍五入),如果插入9999950,数据库就要抛错。

其他的数值类型都是number的衍生,底层都是number,比如integer/int完全映射到number(38)

性能相关:number是一种软实现的类型,如果需要对number做复杂的运算,建议先用cast内置函数转换number为浮点数类型

另外需要注意的一点是:number是变长类型,在计算表存储空间的时候要切记

9. Lob

Clob/blob实现是比较复杂的,主要是用来存储大量数据的数据库字段,最大可以存储4G字节的非结构化数据。

Oracle的Blob字段比较特殊,他比long 字段的性能要好很多,可以用来保存例如图片之类的二进制数据。

写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正的写入blob数据了。

这里只提提几个和性能相关的点,当然能不用lob尽量不用:

oracle8以后:oralce中有四种类型的lob:clob,blob,nclob,bfile.

clob:内部字符大对象;
blob:内部二进制大对象;
nclob:内部定长多字节大对象;
bfile:外部二进制大文件,这个文件中的数据只能被只读访问,并且不包含在数据库内;bfile是早期的RDBMS BLOB的直接继承,
      作为数据库指针存储在数据库内部,指向外部的操作系统文件.

a,按存储方式分: 
     内部LOB:存放在DB内部,包括BLOB,CLOB,BCLOB  
     外部文件:存放在DB外面,就是BFILE

b.按存储数据的类型分:
  ①字符类型:
   CLOB:存储大量 单字节 字符数据。
   NLOB:存储定宽 多字节 字符数据。
  ②二进制类型:
   BLOB:存储较大无结构的二进制数据。
  ③二进制文件类型:
   BFILE:将二进制文件存储在数据库外部的操作系统文件中。存放文件路径。

大对象数据的录入

1,声明LOB类型列
  /*
   conn scott/tiger;
   Create TableSpace ts5_21
      DataFile 'E:/Oracle/ts5_21.dbf'
   Size 5m;
  */
  Create Table tLob ( 
     no Number(4),
     name VarChar2(10),
     resume CLob,
     photo BLob,
     record BFile
    )
  Lob (resume,photo)Store As (
   Tablespace ts5_21  --指定存储的表空间
   Chunk 6k  --指定数据块大小
   Disable Storage In Row 
  );

内部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

2,插入大对象列
  ①先插入普通列数据
  
  ②遇到大对象列时,插入空白构造函数。
   字符型:empty_clob(),empty_nclob()
   二进制型:empty_blob()
   二进制文件类型:BFileName函数指向外部文件。
     BFileName函数:
      BFileName(‘逻辑目录名’,‘文件名’);
      逻辑目录名只能大写,因为数据词典是以大写方式存储。Oracle是区分大小写的。
      在创建时,无需将BFileName函数逻辑目录指向物理路径,使用时才做检查二者是否关联。
   例子:
   Insert Into tLob Values(1,'Gene',empty_clob(),empty_blob(),bfilename('MYDIR','IMG_0210.JPG')); 
   
  ③将逻辑目录和物理目录关联。(如果是二进制文件类型)
   授予 CREATE ANY DIRECTORY 权限
    Grant  CREATE ANY DIRECTORY  TO 用户名 WITH ADMIN OPTION;
   关联逻辑目录和物理目录
    本地
    Create Directory  逻辑目录名  As  ‘文件的物理目录’;
    网络:
    Create Directory  逻辑目录名  As  ‘//主机名(IP)/共享目录’;
   例子:
    Create Directory  MYDIR As 'E:/Oracle';
  
  插入例子:
  insert into tlob values(1,'Gene','CLOB大对象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));

大对象数据的读取和操作:DBMS_LOB包

在oracle中有多种方法可以对lob数据进行操作,但是最常用的为dbms_lob包,它主要提供了以下几个过程供用户对内部lob字段进行维护:

APPEND() 将源LOB中的内容加到目的LOB中
COPY() 从源LOB中复制数据到目的LOB
ERASE() 删除LOB中全部或部分内容
TRIM() 将LOB值减少到指定的长度
WRITE() 向LOB 中写入数据
COMPARE() 比较两个同种数据类型的LOB的部分或全部值是否相同
GETLENGTH() 获取LOB的长度
READ() 从LOB中读出数据

DBMS_LOB包:包含处理大对象的过程和函数
  /*
  insert into tlob values(1,'Gene','CLOB大对象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
  insert into tlob values(2,'Jack','CLOB大对象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
  insert into tlob values(3,'Mary','大对象列CLOB',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
  */
  1,读取大对象数据的过程和函数
   ①:DBMS_LOB.Read():从LOB数据中读取指定长度数据到缓冲区的过程。
     DBMS_LOB.Read(LOB数据,指定长度,起始位置,存储返回LOB类型值变量);
    例子:
    Declare
       varC clob;
      vRStr  varchar2(1000);
       ln number(4);
       Strt number(4);
    Begin
       select resume into varC from tlob where no = 1;
       ln := DBMS_LOB.GetLength(varC);
       Strt := 1;
       DBMS_LOB.Read(varC, ln, Strt, vRStr);
       DBMS_output.put_line('Return:  '||vRStr);
    End;
  
   ②:DBMS_LOB.SubStr():从LOB数据中提取子字符串的函数。
     DBMS_LOB.SubStr(LOB数据,指定提取长度,提取起始位置):
     例子:
    Declare
      varC clob;
       vRStr  varchar2(1000);
       ln number(4);
       Strt number(4);
    Begin
       select resume into varC from tlob where no = 1;
       ln := 4;
       Strt := 1;
       vRStr := DBMS_LOB.SubStr(varC, ln, Strt);
       DBMS_output.put_line('结果为:  '||vRStr);
    End;
   
   ③:DBMS_LOB.InStr():从LOB数据中查找子字符串位置的函数。
    DBMS_LOB.InStr(LOB数据, 子字符串);
    例子:
    Declare 
       varC clob;
       vSubStr  varchar2(1000);
       vRStr  varchar2(1000);
       ln number(4);
    Begin
       select resume into varC from tlob where no = 1;
       vSubStr := '大对象';
       ln := DBMS_LOB.InStr(varC,vSubStr);
       DBMS_output.put_line('位置为:  '||ln);
     
     vRStr := DBMS_LOB.SubStr(varC, Length(vSubStr), ln);
     DBMS_output.put_line('位置为'||ln||'长度为'||Length(vSubStr)||'的子字符串为:'||vRStr);
    End;
   
   ④:DBMS_LOB.GetLength():返回指定LOB数据的长度的函数。
    DBMS_LOB.GetLength(LOB数据);
   
   ⑤:DBMS_LOB.Compare():比较二个大对象是否相等。返回数值0为相等,-1为不相等。
    DBMS_LOB.Compare(LOB数据,LOB数据);
    例子:
    Declare 
       varC1 clob;
       varC2 clob;
       varC3 clob;
       ln number(4);
    Begin
       select resume into varC1 from tlob where no = 1;
       select resume into varC2 from tlob where no = 2;
       select resume into varC3 from tlob where no = 3;
       ln := DBMS_LOB.Compare(varC1,varC1);
       DBMS_output.put_line('比较的结果为:  '||ln);
       ln := DBMS_LOB.Compare(varC2,varC3);
       DBMS_output.put_line('比较的结果为:  '||ln);
    End;

2,操作大对象数据的过程
   操作会改变数据库中原有数据,需要加上Updata锁锁上指定数据列,修改完后提交事务。
   
   ①:DBMS_LOB.Write():将指定数量的数据写入LOB的过程。
    DBMS_LOB.Write(被写入LOB, 写入长度(指写入LOB数据),写入起始位置(指被写入LOB),写入LOB数据);
    例子:
    Declare
       varC clob;
       vWStr  varchar2(1000);
       vStrt number(4);
     ln number(4);
    Begin
       vWStr := 'CLOB';
       ln := Length(vWStr);
       vStrt := 5;
       select resume into varC from tlob where no = 1 FOR UPDATE;
       DBMS_LOB.Write(varC, ln, vStrt, vWStr);
       DBMS_output.put_line('改写结果为:  '||varC);
       Commit;
    End;
   
   ②:DBMS_LOB.Append():将指定的LOB数据追加到指定的LOB数据后的过程。
    DBMS_LOB.Append(LOB数据,LOB数据);
    例子:
    Declare
       varC clob;
       vAStr  varchar2(1000);
    Begin
     vAStr := ',这是大对象列';
     select resume into varC from tlob where no = 1 FOR UPDATE;
     DBMS_LOB.Append(varC, vAStr);
     commit;
     DBMS_output.put_line('追加结果为:  '||varC);
    End; 
   
   ③:DBMS_LOB.Erase():删除LOB数据中指定位置的部分数据的过程;
    DBMS_LOB.Erase(LOB数据,指定删除长度, 开始删除位置);
    例子:
    Declare
       varC clob;
       ln number(4);
       strt number(4);
    Begin
     ln := 1;
     strt := 5;
       select resume into varC from tlob where no = 1 FOR UPDATE;
       DBMS_LOB.Erase(varC, ln, strt);
       commit;
       DBMS_output.put_line('擦除结果为:  '||varC);
    End;  
   
   ④:DBMS_LOB.Trim():截断LOB数据中从第一位置开始指定长度的部分数据的过程;
    DBMS_LOB.Trim(LOB数据,截断长度);
    例子:
    Declare
      varC clob;
      ln number(4);
    Begin
     ln := 4;
       select resume into varC from tlob where no = 1 FOR UPDATE;
       DBMS_LOB.Trim(varC, ln);
       COMMIT;
       DBMS_output.put_line('截断结果为:  '||varC);
    End;
   
   ⑤:DBMS_LOB.Copy():从指定位置开始将源LOB复制到目标LOB;
    DBMS_LOB.Copy(源LOB,目标LOB,复制源LOB长度,复制到目标LOB开始位置,复制源LOB开始位置)
    例子:
    Declare 
       vDEST_LOB clob;
       vSRC_LOB clob;
       AMOUNT number;
       DEST_OFFSET number;
       SRC_OFFSET number;
    Begin
       select resume into vDEST_LOB from tlob where no = 1 FOR UPDATE; 
       select resume into vSRC_LOB from tlob where no = 2 ;
       
       AMOUNT := DBMS_LOB.GetLength(vSRC_LOB);
       DEST_OFFSET := DBMS_LOB.GetLength(vDEST_LOB)+1;
       SRC_OFFSET := 1;
       
       DBMS_LOB.Copy(vDEST_LOB, vSRC_LOB, AMOUNT, DEST_OFFSET, SRC_OFFSET);
       DBMS_output.put_line('拷贝结果为:  '||vDEST_LOB);
    End;

关于使用LOB数据类型的性能问题

a、 一个lob字段包括lobindex和lobsegment,LOB INDEX是隐式创建的

b、 Lob缺省可以存放在表中(表字段),条件是:

1.它的大小小于4kb

2.并且在定义的时候没有使用(disable storage inrow)字句(缺省是enable)

当lob大于4kb的时候它会被存放到lobsegment中

c、当lob存放在表中的时候,它可以被缓存,对于它的操作效率远远高于存储在lobsegment中的lob(不用lobindex)

d、 存储在lobsegment中的lob缺省不在缓冲区缓存,对于lob的读写都是物理IO,代价非常高,所以对于大于4kb的lob字段千万不要频繁更新,效率非常低

e、 存储在lobsegment中的lob可以在定义的时候指定使用cache(默认是nocache),这对于中等大小的lob(比如几k~几十k)很有用处,同时,它还可以减少物理IO。

oracle LOB介绍

发信人: oracle_mo(洗洗睡了... ..)
整理人: zrsoft(2001-11-05 21:43:17), 站内信件  
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出来。 

http://www.cnblogs.com/m-cnblogs/archive/2010/06/30/2708743.html

ORACLE常用数据库类型(转)的更多相关文章

  1. ORACLE常用数据库字段类型

    ORACLE常用数据库字段类型   常用的数据库字段类型如下:   字段类型 中文说明 限制条件 其它说明  CHAR 固定长度字符串 最大长度2000 bytes     VARCHAR2 可变长度 ...

  2. Oracle常用数据库对象(片段)

    1:用户和权限 1.1 用户的创建 a)语法---    create user 用户名  identified by 密码: b)创建用户abcd,并设定密码为abcd;---注意:操作数据库对象是 ...

  3. Oracle常用数据库表操作

    配置数据库: user:orcl.passward:71911.Hao全局数据库名:orcl..解锁数据库用户名,SCOTT,SYSTEM,SYS,   PWD:71911.Hao输入sqlplus, ...

  4. oracle rac 数据库常用命令

    oracle rac 数据库常用命令:1.所有实例和服务的状态srvclt status database -d orcl单个实例的状态:srvctl status instance -d orcl ...

  5. Oracle数据库类型

    Oracle数据库类型 字符类型char[(length)] 定长字符 最长2000字节varchar2[(length)] 可变长度的字符数据类型,最长4000字节NCHAR[(length)] 固 ...

  6. Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法

    Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法 一丶ORM常用字段 ...

  7. oracle常用函数及示例

    学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函 ...

  8. Oracle常用命令大全(很有用,做笔记)

    一.ORACLE的启动和关闭 1.在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a.启动ORACLE系统 oracle>svrmgrl ...

  9. Oracle常用语法

    Oracle常用语句语法汇总 Oracle10g 1 第一章Oracle命令 a) 系统管理员连接 conn */* as sysdba b) 查询当前用户 show user c) 创建新用户 cr ...

随机推荐

  1. PredictionIO Open Source Machine Learning Server

    PredictionIO Open Source Machine Learning Server Build Smarter Software with Machine Learning Predic ...

  2. Haxe UI框架StablexUI的使用备忘与心得(一)

    这一节先来说说StablexUI的基本方面. 安装与使用,在官方文档里Getting Started一章里写的很清楚,这里就不展开了,简单总结来说: * StablexUI依赖于actuate缓动库和 ...

  3. 在程序中,你敢怎样使用“goto”语句!

    用goto是一个个人爱好的问题.“我”的意见是,十个goto中有九个可以用相应的结构化结构来替换.在那些简单情形下,你可以完全替换掉goto,在复杂的情况下,十个中也有九个可以不用:你可以把部分代码写 ...

  4. 用定时器T0查询方式P0口8位控制LED闪烁

    #include<reg52.h> #define uchar unsigned char #define uint unsigned int void main (void) { uch ...

  5. 【linux驱动笔记】字符设备驱动相关数据结构与算法

    欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  6. “/” 应用程序中的服务器错误 - IIS 发布错误

    解决方法, 将bin目录下的全部文件复制到iis下

  7. bottle-session 0.2 : Python Package Index

    bottle-session 0.2 : Python Package Index bottle-session 0.2 Download bottle-session-0.2.tar.gz Redi ...

  8. [免费活动通知]RAD Studio XE8 技术研讨会(上海、成都)

     活动类型:免费研讨会 报名链接: http://forms.embarcadero.com/AP15Q3CNRADStudioDeepDiveSeminar 上海 2015 年 8 月 13 日 ...

  9. URL vs. HTML 录制模式

    转自:http://blog.csdn.net/testing_is_believing/article/details/5274188 一般来说,如果是标准使用IE访问的B/S架构,应该使用HTML ...

  10. Android-Cannot merge new index 66195 into a non-jumbo instruction的解决的方法

    转载请注明来源:http://blog.csdn.net/goldenfish1919/article/details/33729679 用eclispe打包的时候报错: [2014-06-23 13 ...