zoukankan      html  css  js  c++  java
  • [转载]DBMS_LOB

    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,

                            

  • 相关阅读:
    spring总结
    mybatis总结
    HttpClient,okhttp,Jodd-http 使用上的差异
    RPC序列化
    RPC是什么? (学习笔记)
    MySQL普通索引与唯一索引
    MySQL 存储引擎
    TCP的流量控制和拥塞控制
    【转载】Windows自带.NET Framework版本大全
    [知识点] 总目录
  • 原文地址:https://www.cnblogs.com/AaronBear/p/10613956.html
Copyright © 2011-2022 走看看