发信人: 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出来。

oracle lob值是什么,oracle LOB介绍相关推荐

  1. oracle怎么值自增长,oracle怎么实现自增长

    oracle如何实现自增长? 点击右边红色标题查看本文完整版:oracle如何实现自增长? oracle如何实现自增长,有一个表: CREATE TABLE `dutswitch` ( `ID` in ...

  2. oracle绑定值的结尾,Oracle Sql字符串多余空格处理方法小记

    (一)问题提出: 不知道大家有没有遇到过这样的情况,同样的sql在pl/sql下面执行正常,但是拷贝到表字段中,点击提交的时候老是会报ORA-01480: STR 绑定值的结尾 Null错误,如图: ...

  3. oracle通过值查字段,Oracle 中 根据值 查询 所在 表和字段

    -------------------- -- 这里是查询 数字型字段值 /*declare CURSOR cur_query IS select table_name, column_name, d ...

  4. oracle 0值处理判断,ORACLE数据统计0的处理

    大概是前一周去见客户,他要弄了年终统计报表,从系统中所有台帐的基础数据去统计总算.容量等数据. 拿到统计模板一看,傻眼了需要统计近百项,而且每一项都需要单独使用SQL去查询. 起初  为了方便查询数据 ...

  5. oracle没有值显示0,oracle查询最近7天数据没有展示0

    假设现在有两张表order和user order表 order_no订单号 create_time创建时间 price价格 GC123 2017-3-17 1600 GC124 2017-3-22 1 ...

  6. 踩坑日记——Oracle 错误:ORA-22922 不存在的 LOB 值

    今天在系统中测试导出报表的时候,根据人名.工号.单据号.项目等条件分别导出都没有出现问题,唯独无条件导出时报以下错误: Oracle 错误:ORA-22922 不存在的 LOB 值 根据报错信息进行排 ...

  7. oracle中LOB字段相关概念(自动创建LOB索引段和重建索引方法)

    OBs,或Large Objects字段,是Oracle中用于处理存储非字符数据推荐的一种字段类型,例如mp3,video,图片,和long字符串数据.二进制大对象,或BLOBs,字符大对象,或CLO ...

  8. 不存在lob值 java,ORA-22922: 不存在的 LOB 值

    "ORA-22922: 不存在的 LOB 值"有时和ORA-01790一起出来,01790是说类型不一致,常见的有wm_concat函数,高版本的Oracle都不再支持wm_con ...

  9. oracle-ORA-22922: 不存在的 LOB 值

    项目进行对于多行数据某个列数据转换为一个字符串查询时,出现[ORA-22922: 不存在的 LOB 值]异常信息,具体异常栈 根据项目信息获取指出调剂列表: ### Error querying da ...

  10. Oracle 内存(SGA,PGA)详细介绍

    一.名词解释 (1)SGA:SystemGlobal Area是OracleInstance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池.数据缓冲区.日志缓冲区. (2) ...

最新文章

  1. SQLServer查看存储过程的方法
  2. C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题
  3. flash写保护原理_老司机带路:LPC82x 存储器及读写保护 手到擒来!
  4. Dockerfile 使用 ARG 参数实现构建模板
  5. 【DevCloud·敏捷智库】如何利用故事点做估算
  6. Vue的常用指令有哪些,分别是什么作用?
  7. java中子类与父类强制转换_java中父类强制转换成子类的错觉
  8. Java网络编程之客户端中的Socket
  9. webbench之编译安装(一)
  10. 2020年Java面试100题
  11. html图片自适应屏幕大小
  12. 这几款超好用的协同办公软件,你都get了吗
  13. 如何实现话费充值api接口?详细讲解源码
  14. jsv8引擎 垃圾回收机制
  15. seata的部署与微服务集成(包含多集群异地容灾配置)
  16. 1. ELK docker部署
  17. python PIL库对图片按比例进行分割
  18. 排列组合相关公式讲解(Anm,Cnm等)
  19. 纺织erp有哪些,纺织企业为什么要上ERP
  20. KVM 核心技术详解

热门文章

  1. 拒绝访问病毒解决方法
  2. WIN7点击右下角 安全删除硬件并弹出媒体 无反应解决方法
  3. nginx 代理 负载均衡 网站转接的用法
  4. ⅰsee是什么意思_see是什么意思?
  5. 香山处理器仿真环境搭建
  6. Android 屏蔽Power键 Home键
  7. 计算机网络总结篇-我们是怎么访问百度的?
  8. L1-061 新胖子公式
  9. jupyter 安装问题 No such notebook dir
  10. 微信小程序(八 配置和请求)