1LOB背景

在现在的系统开发中,需要存储的已不仅仅是简单的文字信息,也包括一些图片、音像资料或者超长的文本,这要求后台数据库具有存储这些数据的能力,Oracle通过提供LOB对象实现了该功能。

2LOB

在ORACLE数据库中,LOB大对象类型是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储达4GB的数据)。目前LOB分为内部LOB和外部LOB。

      2.1 内部LOB

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

Oracle支持的三种内部LOB为:BLOB(二进制数据)、CLOB(单字节字符数据)、NCLOB(多字节国家字符数据)。其中CLOB和NCLOB类型适用于存储超长的文本数据,BLOB类型适用于存储大量的二 进制数据,如图像、视频等。

      2.2 外部LOB

ORACLE仅支持一种外部LOB类型:BFILE类型。在数据库内,该类型仅存储数据在操作系统中的位置信息,而数据的实体   以外部文件的形式存在与操作系统的文件系统中。因而该类型所表示的数据时只读的,不参与事务。该类型可帮助用户管理大量的由外部程序访问的文件。

3LOB的使用

ORACLE提供了多种使用和维护LOB的方式,如使用PL/SQL中的DBMS_LOB包,调用OCI(Oracle Call Interface)、使用Proc*C/C++、使用JDBC等。其中最方便有效的是使用PLSQL调用的DBMS_LOB包。

在ORACLE中,存储在LOB中的数据称为LOB的值,如使用SELECT对某一LOB字段进行选择查询,则返回的不是LOB的值,而是该LOB字段的定位器(相当于定向LOB值的指针),DBMS_LOB包中提供的所有函数和过程都以LOB定位器作为参数。

     3.1 DBMS_LOB过程

DBMS_LOB包中主要提供以下几个过程供用户对内部LOB字段进行维护:

APPEND:将源LOB中的内容加到目的LOB中。

CLOSE:关闭已经打开的LOB。

CREATETEMPORARY:在用户的临时表空间中,建立临时LOB。

FILECLOSE:关闭打开的BFILE定位符所指向的OS文件。

FILECLOSEALL:关闭当前会话已经打开的所有BFILE文件。

FILEEXISTS:确定file_loc对应的OS文件是否存在,1:存在。0:不存在。

FILEGETNAME:获取BFILE定位符所对应的目录别名和文件名。

FILEISOPEN:确定BFILE对应的OS文件是否打开。

FREETEMPORARY:释放在默认临时表空间中的临时LOB。

FILEOPEN:打开文件。

GETCHUNKSIZE:当建立包含CLOB/BLOB列的表时,通过指定CHUNK参数可以指定操纵LOB需要分配的字节数(数据库尺寸的整数倍)默认为数据块的尺寸。

COPY:从源LOB中复制数据到目的LOB。

ERASE:删除LOB中全部或部分内容。

TRIM:将LOB值减少到指定的长度。

WRITE:向LOB中写入数据。

INSTR:返回特定样式数据从LOB某偏移位置开始出现N次的具体位置。

IDOPEN:确定LOB是否打开,打开:1,未打开:0。

ISTEMPORARY:确定定位符是否为临时LOB。

LOADFROMFILE:将BFILE的部分或全部内容复制到目标LOB变量。

LOADBLOBFROMFILE:将BFILE数据装载到BLOB中,并且在装载后取得最新的偏移位置。

OPEN:打开LOB,open_mode(只读:dbms_lob.lob_readonly,写:dbms_lob.lob_readwrite)。

COMPARE:比较两个同种数据类型的LOB的部分或全部值是否相同。

GETLENGTH:获取LOB的长度。

READ:从LOB中读出数据。

SUBSTR:与字符处理函数SUBSTR使用方法一样。

WRITEAPPEND:将缓冲区数据写到LOB尾部。

     3.2 常用过程

          3.2.1 写入对象

PROCEDURE WRITE(lob_loc IN OUT BLOB,

amount  IN BINARY_INTEGER,

offset  IN INTEGER,

buffer  IN RAW);

PROCEDURE WRITE(lob_loc IN OUT CLOB CHARACTER SET any_cs,

amount  IN BINARY_INTEGER,

offset  IN INTEGER,

buffer  IN VARCHAR2 CHARACTER SET lob_loc%charset);

各参数的含义为:

lob_loc:要写入的LOB定位器。

amount:写入LOB中的字节数。

offset:指定开始操作的偏移量。

buffer:指定写操作的缓冲区。

实例:  DECLARE

obloc CLOB;

buffer VARCHAR2(2000);

amount NUMBER := 20;

offset NUMBER := 1;

BEGIN

--初始化要写入的数据  

buffer := 'This is a writing example';

amount := length(buffer);

SELECT document

INTO lobloc --   获取定位器并锁定行  

FROM view_sites_info

WHERE site_id = 100

FOR UPDATE;

dbms_lob.write(lobloc,

amount,

1,

buffer);

COMMIT;

END;

注意事项:

(1)在调用写过程前一定要使用SELECT语句检索到定位器且用FOR UPDATE子句锁定行,否则不能更新LOB。

(2)写过程从offset指定的位置开始,向LOB中写入长度为amount的数据,原LOB中在这个范围内的任何数据都将被覆盖。

(3)缓冲区的最大容量为32767字节,因此在写入大量数据时需多次调用该过程。

              3.2.2 读取对象

PROCEDURE WRITE(lob_loc IN OUT BLOB,

amount  IN BINARY_INTEGER,

offset  IN INTEGER,

[转载]DBMS_LOB的更多相关文章

  1. [转载]dbms_lob用法小结

    http://blog.sina.com.cn/s/blog_713978a50100prkt.html CLOB里存的是2进制 判定长度   DBMS_LOB.GETLENGTH(col1)获取文本 ...

  2. php连接oracle10数据库 转载

    本文转载自:http://blog.csdn.net/wzg199088/article/details/6678241 一.配置环境: 访问Oracle8以上的数据库需要用到Oracle8Call- ...

  3. Crystal Clear Applied: The Seven Properties of Running an Agile Project (转载)

    作者Alistair Cockburn, Crystal Clear的7个成功要素,写得挺好. 敏捷方法的关注点,大家可以参考,太激动所以转载了. 原文:http://www.informit.com ...

  4. RTP与RTCP协议介绍(转载)

    RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...

  5. 《Walking the callstack(转载)》

    本文转载自:https://www.codeproject.com/articles/11132/walking-the-callstack Download demo project with so ...

  6. [转载]MVVM模式原理分析及实践

    没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...

  7. [转载]:STM32为什么必须先配置时钟再配置GPIO

    转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...

  8. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作

    从MyEclipse转战到IntelliJ IDEA的经历 注转载址:http://blog.csdn.net/luoweifu/article/details/13985835 我一个朋友写了一篇“ ...

  9. TCP同步与异步,长连接与短连接【转载】

    原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896   这是今天看到的一篇讲到T ...

随机推荐

  1. JDBC API 事务的实践

    使用了持久化框架几乎没有使用过原生的jdbc API ,发现原来使用jdbc API来实现事务也是很简单的. 数据库的链接connection具有一个属性autocommit,这个属性默认是true, ...

  2. __x__(35)0908第五天__ 层级 z-index

    如果三个 div 全部设置 position: absolute; 绝对定位,且未设置 z-index,  则从代码结构上    下面的元素 会盖住 上面的元素. z-index 层级: 通过 z-i ...

  3. CSS3_标准盒子模型和怪异盒子模型

    #box{ width: 200px; height: 200px; background-color: pink; } 标准盒子模型 box-sizing: content-box; padding ...

  4. TextInputLayout 用法

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  5. 开启windows的 admin+开启tel+电源+远程功能

    1.控制面板   小图标   程序功能   打开关闭windows功能     开启Telnet 的服务两个都选         2. 启动tel服务   控制面板  小图标 管理工具 服务 找到 t ...

  6. ldd可执行程序时返回not a dynamic executable

    原因:32位程序放在64位机器上或64位程序放在32位程序上了 解决方法:如果是32位程序放在64位系统上则安装yum -y install libstdc++.i686,64位则是yum -y in ...

  7. [dev] EPOLLOUT的应用场景

    问题 什么场景下,才需要epoll EPOLLOUT消息呢?也就是监听write 分析 找到一篇知乎,基本上读完就明白了 https://www.zhihu.com/question/22840801 ...

  8. Servlet的相关类--ServletConfig(接口)

    ServletConfig是一个接口,有关配置文件的 servlet的配置信息<---对应--->ServletConfig web.xml配置文件会被加载到内存中,然后解析器会对它进行解 ...

  9. python摸爬滚打之----tcp协议的三次握手四次挥手

    TCP协议的三次握手, 四次挥手 三次握手过程 1, 服务器时刻准备接受客户端进程的连接请求, 此时服务器就进入了LISTEN(监听)状态; 2, 客户端进程然后向服务器发出连接请求报文, 之后客户端 ...

  10. git使用手册整理

    -------------------20181217------------------- git使用:在gitbash 下初始化用户: $ git config --global user.nam ...