oracle lob值是什么,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出来。
oracle lob值是什么,oracle LOB介绍相关推荐
- oracle怎么值自增长,oracle怎么实现自增长
oracle如何实现自增长? 点击右边红色标题查看本文完整版:oracle如何实现自增长? oracle如何实现自增长,有一个表: CREATE TABLE `dutswitch` ( `ID` in ...
- oracle绑定值的结尾,Oracle Sql字符串多余空格处理方法小记
(一)问题提出: 不知道大家有没有遇到过这样的情况,同样的sql在pl/sql下面执行正常,但是拷贝到表字段中,点击提交的时候老是会报ORA-01480: STR 绑定值的结尾 Null错误,如图: ...
- oracle通过值查字段,Oracle 中 根据值 查询 所在 表和字段
-------------------- -- 这里是查询 数字型字段值 /*declare CURSOR cur_query IS select table_name, column_name, d ...
- oracle 0值处理判断,ORACLE数据统计0的处理
大概是前一周去见客户,他要弄了年终统计报表,从系统中所有台帐的基础数据去统计总算.容量等数据. 拿到统计模板一看,傻眼了需要统计近百项,而且每一项都需要单独使用SQL去查询. 起初 为了方便查询数据 ...
- oracle没有值显示0,oracle查询最近7天数据没有展示0
假设现在有两张表order和user order表 order_no订单号 create_time创建时间 price价格 GC123 2017-3-17 1600 GC124 2017-3-22 1 ...
- 踩坑日记——Oracle 错误:ORA-22922 不存在的 LOB 值
今天在系统中测试导出报表的时候,根据人名.工号.单据号.项目等条件分别导出都没有出现问题,唯独无条件导出时报以下错误: Oracle 错误:ORA-22922 不存在的 LOB 值 根据报错信息进行排 ...
- oracle中LOB字段相关概念(自动创建LOB索引段和重建索引方法)
OBs,或Large Objects字段,是Oracle中用于处理存储非字符数据推荐的一种字段类型,例如mp3,video,图片,和long字符串数据.二进制大对象,或BLOBs,字符大对象,或CLO ...
- 不存在lob值 java,ORA-22922: 不存在的 LOB 值
"ORA-22922: 不存在的 LOB 值"有时和ORA-01790一起出来,01790是说类型不一致,常见的有wm_concat函数,高版本的Oracle都不再支持wm_con ...
- oracle-ORA-22922: 不存在的 LOB 值
项目进行对于多行数据某个列数据转换为一个字符串查询时,出现[ORA-22922: 不存在的 LOB 值]异常信息,具体异常栈 根据项目信息获取指出调剂列表: ### Error querying da ...
- Oracle 内存(SGA,PGA)详细介绍
一.名词解释 (1)SGA:SystemGlobal Area是OracleInstance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池.数据缓冲区.日志缓冲区. (2) ...
最新文章
- SQLServer查看存储过程的方法
- C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题
- flash写保护原理_老司机带路:LPC82x 存储器及读写保护 手到擒来!
- Dockerfile 使用 ARG 参数实现构建模板
- 【DevCloud·敏捷智库】如何利用故事点做估算
- Vue的常用指令有哪些,分别是什么作用?
- java中子类与父类强制转换_java中父类强制转换成子类的错觉
- Java网络编程之客户端中的Socket
- webbench之编译安装(一)
- 2020年Java面试100题
- html图片自适应屏幕大小
- 这几款超好用的协同办公软件,你都get了吗
- 如何实现话费充值api接口?详细讲解源码
- jsv8引擎 垃圾回收机制
- seata的部署与微服务集成(包含多集群异地容灾配置)
- 1. ELK docker部署
- python PIL库对图片按比例进行分割
- 排列组合相关公式讲解(Anm,Cnm等)
- 纺织erp有哪些,纺织企业为什么要上ERP
- KVM 核心技术详解