一、简介

在ORACLE数据库中,LOB(Large Objects(大对象))是用来存储大量的二进制和文本数据的一种数据类型。在 Oracle8i 中开始提供 LOB 字段,在 Oracle10g 前最多只能存储 4G 数据,从 Oracle10g 开始,可以存储 8-128T 的数据,取决于你的数据库的块大小。

LOB又分为两种类型:
    
        内部LOB类型:将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。如:

BLOB:二进制大对象。定义一个 BLOB 变量,用于存储大量的二进制数据(如图像、视频、音频等),该二进制大对象存储于数据库中。

CLOB:字符型大对象(单字节字符数据)。定义一个 CLOB 变量,用于存储超长的文本数据,该字符型大对象存储于数据库中。

NCLOB:字符型大对象(多字节国家字符数据)。定义一个 NCLOB 变量,用于存储超长的文本数据,该字符型大对象存储于数据库中。

外部LOB类型:在数据库内仅存储数据在操作系统中的位置信息,而数据的实体以外部文件的形式存在于操作系统的文件系统中。因而,该类型所表示的数据是只读的,不参与事务。如:

BFILE:二进制文件。定义一个 BFILE 变量,它指向操作系统的一个文件,Oracle 会将其视为二进制数据进行处理。

二、内部LOB(BLOB/CLOB/NCLOB)

在 Oracle 中,存储在 LOB 列中的不是实际的数据,而是该LOB字段的定位器,即指向 LOB 数据在数据库中实际存储的位置(不是内存中)的指针。而要对某一 LOB 的值进行访问和维护操作,首先得获取到这个 LOB 指针,然后使用 DBMS_LOB 包中提供的函数和过程处理实际的 LOB 数据。

    1、创建

通过系统函数 EMPTY_CLOB(),得到一个空的 LOB 指针,但这个指针在此时不指向磁盘中的任何位置,也没有任何 LOB 数据。它可用于初始化 LOB 变量,或者在 INSERT 或 UPDATE 语句中用于将LOB列进行初始化(根据表的定义确定存储的位置),但不填充数据,如果需要使用该初始化后的 LOB,需要再一次从表中查询它出来。

INSERT INTO lob_demo (lob_id, lob_content) VALUES (100,EMPTY_CLOB());

    2、写入

没有指向数据库实际存储位置的 LOB 不能被写入;更新 LOB 时必须要用for update 锁定

DECLARElob_object CLOB;amount BINARY_INTEGER;offset INTEGER;content_str VARCHAR2(100);BEGIN--插入一行新的记录来创建一个新的 LOB 定位器(没有指向数据库实际存储位置的 LOB 不能被写入)INSERT INTO lob_demo (lob_id, lob_content) VALUES (100, EMPTY_CLOB());--检索出上面创建的 LOB 的定位器(更新 LOB 必须要用 for update 锁定)SELECT lob_content INTO lob_object FROM lob_demo WHERE lob_id=100 for update;content_str := 'Follow I-75 across the Mackinac Bridge.';amount := LENGTH(content_str); -- 要写入的字符数offset := 1; -- LOB 中开始写入的位置DBMS_LOB.OPEN(lob_object, DBMS_LOB.LOB_READWRITE); -- 打开 LOB(不是严格必须的)DBMS_LOB.WRITE(lob_object, amount, offset, content_str);  -- 开始写入DBMS_LOB.CLOSE(lob_object);  -- 关闭END;

    3、读取

DECLARElob_object CLOB;content_str VARCHAR2(300);read_amount BINARY_INTEGER;offset INTEGER;BEGIN--检索先前插入的 LOB 定位器SELECT lob_content INTO lob_object FROM lob_demo WHERE lob_id =100;offset := 1;read_amount := 200;DBMS_LOB.READ(lob_demo, read_amount, offset, content_str);IF read_amount = 200 THEN   ----如果实际读了200个字符,更新偏移量,继续尝试读取.DBMS_OUTPUT.PUT_LINE(content_str);offset := offset + read_amount;DBMS_LOB.READ(lob_demo, read_amount, offset, content_str);DBMS_OUTPUT.PUT_LINE(content_str);ELSE   --如果实际没读够200个,则表示已经读取完了DBMS_OUTPUT.PUT_LINE(content_str);END IF;END;


三、外部LOB(BFILE)

在 PL/SQL 中操作 BFILE,其实也是操作 LOB 指针。只是对于 BFILE 的指针来说,它指向的 BFILE 数据在数据库外。所以,一个 BFILE 列的两行,可以存储指向同一个文件的 BFILE 指针。

和BLOB,CLOB,NCLOB三种大字段类型相比,BFILE 有以下三点不同:

1) BFILE 的数据是存储在操作系统文件中的,而不是在数据库中

2) BFILE 数据不参与事务处理,也就是说,BFILE 数据的改变不能被提交和回滚(但 BFILE 指针的改变是可以提交或回滚的)

3) 从 PL/SQL 中,只能读取 BFILE 数据,而不能写入。必须得在数据库外先创建 BFILE 文件,再创建 BFILE 指针

    1、创建

BFILE 指针由目录和文件名组成,将这两部分信息作为参数传入 BFILENAME 函数,该函数会返回一个 BFILE 指针

一个 BFILE 指针只是简单地将目录和文件名联合在一块,而实际的目录和文件甚至可以不存在。所以,你可以创建一个目录,它实际指向的路径并不存在;再使用这个目录创建一个 BFILE 指针

-- 第一步:
create directory bfile_data as '/usr/local/bfiledata';  --创建一个目录-- 第二步:
DECLAREpiece_bfile BFILE;BEGINpiece_bfile := BFILENAME('BFILE_DATA','test.jpg'); --创建一个BFILE指针INSERT INTO bfile_demo (bfile_id, bifle_content) VALUES (100, piece_bfile);   --保存到表中END;

    2、读取

DECLAREbfile_object BFILE;piece RAW(60);amount BINARY_INTEGER := 60;offset INTEGER := 1;BEGINSELECT bifle_content INTO bfile_object FROM bfile_demo WHERE bfile_id = 100;-- 打开这个指针,读取60个字节,然后关闭它DBMS_LOB.OPEN(bfile_object);  DBMS_LOB.READ(bfile_object, amount, 1, piece);DBMS_LOB.CLOSE(bfile_object);--16进制显示结果DBMS_OUTPUT.PUT_LINE(RAWTOHEX(piece));END;

    3、转换

BFILE 提供了一种从数据库中访问文件系统中数据的方法,同时 ORACLE 也提供了从 BFILE 到 LOB 的方法:DBMS_LOB.LOADCLOBFROMBFILE和DBMS_LOB.LOADBLOBFROMBFILE

DECLAREpiece_bfile BFILE := BFILENAME('BFILE_DATA','test.jpg'); --创建一个BFILE指针photo_blob BLOB;BEGINSELECT bifle_content INTO photo_blob FROM bfile_demo WHERE bfile_id = 101;DBMS_LOB.OPEN(photo_blob, DBMS_LOB.LOB_READWRITE);DBMS_LOB.OPEN(piece_bfile);DBMS_LOB.LOADBLOBFROMFILE(photo_blob, piece_bfile, DBMS_LOB.LOBMAXSIZE, 1, 1);DBMS_LOB.CLOSE(photo_blob);DBMS_LOB.CLOSE(piece_bfile);END;


四、Temporary LOBs

    1、说明

Temporary LOB,它跟我们先前介绍的 LOB 不一样,先前的可以称之为 Persistent LOB。有时候,我们需要 Temporary LOB,就像其它类型的本地变量一样,在会话中使用,而不用持久化到数据库中。

Temporary LOB 的默认生存期是其所在的会话的生存期,但可以被手工释放。使用 Temporary LOB,不会产生 REDO 和 UNDO 信息,所以能提供更好的性能。

和 Persistent LOB 一样,Temporary LOB 数据也是保存在数据库中的,不要以为它是在内存中存在的。但 Temporary LOB 数据并不跟任何表的列相关联,而是保存在该会话所占用的临时表空间中。所以使用 Temporary LOB,你得保证临时表空间足够存储它。

    2、创建

有两种创建方法,一种是使用系统过程 DBMS_LOB.CREATETEMPORARY 显式创建,一种是直接赋值隐式创建。

显式创建:

DBMS_LOB.CREATETEMPORARY (-- 指定LOB定位符lob_loc IN OUT NOCOPY [ BLOB | CLOB CHARACTER SET ANY_CS ],  -- 是否将LOB读取到缓冲区cache IN BOOLEAN,   -- 指定何时清除临时LOB(DBMS_LOB.SESSION(10):会话结束时。DBMS_LOB.CALL(12):调用结束时)dur IN PLS_INTEGER := DBMS_LOB.SESSION
);

隐式创建:

DECLAREtemp_clob CLOB;
temp_blob BLOB;BEGIN--给 NULL 的 LOB 变量赋值temp_clob := 'www.baidu.com';temp_blob := HEXTORAW('7A');END;

    3、释放

使用系统过程 DBMS_LOB.FREETEMPORARY 释放 Temporary LOB

在 PL/SQL 中,若已被释放掉的 Temporary LOB 指针被赋值给另一个 LOB 指针,则这个指针也被释放

系统函数 DBMS_LOB.ISTEMPORARY 可以判断一个 LOB 指针是否指向 Temporary LOB 数据

-- 返回值:1 表示入参为 Temporary LOB 指针;0 表示入参是 persistent LOB 指针
DBMS_LOB.ISTEMPORARY (lob_loc IN [ BLOB | CLOB CHARACTER SET ANY_CS ]) RETURN INTEGER;  

    4、管理

1) 和 persistent LOB 不同,Temporary LOB 不支持事务管理、一致性读取、回滚等等,所以你应该注意以下几点:

* 当处理 Temporary LOB 发生错误时,你必须释放该 LOB,然后重新进行该处理

* 由于不支持一致性读取和回滚,所以你不能将多个 LOB 指针都指向同一个 Temporary LOB 数据

* 若一个用户想要修改一个 Temporary LOB 数据,但该数据与另一个 LOB 指针关联,则会发生该 Temporary LOB 数据的拷贝(deep copy)。那么指向该 LOB 数据的其它指针将会看到不同的数据。为了降低 deep copy,当将 Temporary LOB 作为参数传递时,使用 NOCOPY 线索;

* 通过调用 DBMS_LOB.COPY 过程,可以将 Temporary LOB 数据持久化到数据库中

* 在一个会话中,Temporary LOB 指针是唯一的。不能将一个指针从一个会话传递到另一个会话,使得相关联的 LOB 数据在另一个会话中可用

2) 从 Oracle9i Database Release 1 开始,可以通过视图 v$temporary_lobs 来查看每个会话中有多少被缓存的和未被缓存的 LOBs。还可以通过数据字典 dba_segments 来查看每个会话中 LOB 占用的空间。

五、参考

http://blog.csdn.net/cunxiyuan108/article/details/6422387

Oracle - LOB(大对象数据类型)相关推荐

  1. oracle怎么删除lob对象,Oracle系列:LOB大对象处理

    Oracle系列:LOB大对象处理 Oracle系列:LOB大对象处理 主要是用来存储大量数据的数据库字段,最大可以存储4G字节的非结构化数据. 主要介绍字符类型和二进制文件类型LOB数据的存储,单独 ...

  2. oracle存储多少条数据类型,Oracle目前可以存储极大的对象,这是因为它引入了四种新的数据类型。其中哪一种大对象数据类型在数...

    Oracle目前可以存储极大的对象,这是因为它引入了四种新的数据类型.其中哪一种大对象数据类型在数 更多相关问题 谈谈我国幼儿教师的基本权利和义务. 请帮忙给出正确答案和分析,谢谢! 监察机关在办理监 ...

  3. Java大对象lob_JavaEE JDBC 读写LOB大对象

    JDBC 读写LOB大对象 @author ixenos LOB 除了数字.字符串和日期之外,许多数据库还可以存储大对象,例如图片或其他数据, 在SQL中,二进制大对象称为BLOB,字符型大对象称为C ...

  4. oracle对大对象类型操作:blob,clob,nclob,bfile

    在oracle中,有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob.下面是对lob数据类型的简单介绍.blob:二进制lob,为二进制数据,最长可达4GB,存贮在数据 ...

  5. 11g大对象数据新技术

    2019独角兽企业重金招聘Python工程师标准>>> Oracle Acs资深顾问罗敏 老罗技术核心感悟: 11g大对象数据新技术 2016/02/15 by Maclean Li ...

  6. oracle lob类型和mysql text_LOB数据类型

    概述 由于无结构的数据往往都是大型的,存储量非常大,而LOB(large object)类型主要用来支持无结构的大型数据.用户可以用LOB数据类型来存储大型的无结构数据,特别是文本,图形,视频和音频等 ...

  7. oracle lob 简单介绍

    何为LOB? lob为oracle数据库的一个大对象数据类型,可以存储超过4000bytes的字符串,二进制数据,OS文件等大对象信息.最大可存储的容量根oracle的版本和oracle 块大小有关. ...

  8. Spring 让 LOB 数据操作变得简单易行,LOB 代表大对象数据,包括 BLOB 和 CLOB 两种类型

    http://www.ibm.com/developerworks/cn/java/j-lo-spring-lob/index.html 本文讲解了在 Spring 中处理 LOB 数据的原理和方法, ...

  9. mysql 大对象_Oracle 4个大对象(lobs)数据类型介绍

    在oracle中,有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob. 在Oracle中,有4个大对象(lobs)类型可用,分别是blob,clob,bfile,ncl ...

最新文章

  1. SpringCloud服务注册启动的时候报错(com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException)
  2. 一种思路:策略模式 + 反射工厂,很好的实现了开闭原则
  3. linux学习总结--linux100day(day2)
  4. spark 架构_深入研究Spark内部和架构
  5. poj 2987 Firing (最大权 闭合 图)
  6. axure下载及汉化
  7. java继承与覆盖_Java-继承与覆盖【摘抄】
  8. 锐捷(四)交换机虚拟化(VSU)+双主机检测(BFD)的配置
  9. .net C# asp.net SMTP 匿名发邮件完整解决方案,有源码.
  10. Benchmarking of computational error-correction methods for next-generation sequen下一代测序数据的计算纠错方法的基准测试
  11. Proximal Algorithms 6 Evaluating Proximal Operators
  12. Live800:企业必修课|新时代的全渠道营销解析(下)
  13. JUC源码分析16-集合-ConcurrentSkipListMap、ConcurrentSkipListSet
  14. oracle部门总工资的函数,Oracle分析函数
  15. word合并文档php,使用PHPWord合并Word文档,在文档指定页插入另一个文档的内容
  16. 看一遍都懂的数组遍历~确定不试试?
  17. 如何把几张照片拼在一起?
  18. 雅虎微软合作对手机搜索领域的影响
  19. 优化Kubernetes横向扩缩HPA
  20. 3D游戏建模师加不加班?严重吗?

热门文章

  1. 高分请教:j2ee的例子PetStore中许多类为什么要实现Serializable 接口
  2. 基于JSP开发的电影票预订系统 JAVA MySQL
  3. 实体商家如何通过小魔推同城拓客,在短视频平台提升曝光量
  4. linux mint能用安卓,如何在Ubuntu和Linux Mint上安装Android Studio
  5. 一些java基础题答案汇总
  6. Rabbit 5大模式
  7. 为什么R.Stallman这次来华讲学可能跑题?
  8. Channel 9视频整理【1】
  9. 对比两个字符串A、B的连续子串
  10. matlab yalmip在微电网优化调度中的应用(一)