oracle 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出来。
-------------------------
from :
阅读(3797) | 评论(0) | 转发(0) |