oracle的字段类型(large object)-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 3977243
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: oracle

2006-11-29 14:40:56

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) |
0

上一篇:oracle数据字典

下一篇:oracle number类型细讲

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图