• oracle ——lob对象 /bfile 字段


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

    具体类型:

    Internal LOBs:LOB数据存储在oracle的tablespace中。

    • CLOB,NCLOB:为大字符串类型,NLOB为多语言集字符类型,类似于NVARCHAR类型,用他们代替以前的LONG类型;
    • BLOG:BLOG为大二进制类型,用来代替以前的LONG RAW类型。

     

    External LOBs:LOB数据存储在数据库外部的操作系统文件中。

    • BFIEL是唯一的External LOBs.提供了在SQL中访问外部文件的方法,BFILE可存储操作系统中的各种文件。

    bfile字段特点:

    •  BFILE 的数据是存储在操作系统文件中,而不是在数据库中,字段中存储的是文件定位指针;
    • BFILE 数据不参与事务处理,也就是说,BFILE 数据的改变不能被提交和回滚(但 BFILE 指针的改变是可以提交或回滚的);
    • 从 PL/SQL 中,只能读取 BFILE 数据,而不能写入。必须得在数据库外先创建 BFILE 文件,再创建 BFILE 指针。
    1. 创建
    BFILE 指针由目录和文件名组成,将这两部分信息作为参数传入 BFILENAME 函数,该函数会返回一个 BFILE 指针。

    1 create or replace directory BILL_DIR_1_20130101 as 'D:\话单\mgw1\20130101';  /*创建目录*/
    2 
    3  bill_file varchar2(100);   
    4  bill_fileloc  bfile;   //定义bfile指针
    5  bill_file:='C2557.dat'
    6
    7 bill_fileloc:=bfilename('BILL_DIR_1_20130101',bill_file); //获得指向文件的映射,而不是文件本身

    一个 BFILE 指针只是简单地将目录和文件名联合在一块,而实际的目录和文件甚至可以不存在。所以,你可以创建一个目录,它实际指向的路径并不存在;再使用这个目录创建一个 BFILE 指针。很多时候,这种功能使得我们编程很方便。

    2. 读取

    通过使用dbms_lob包进行对bfile读入到blob/clob对象的操作(只读)。

    dest_lob blob;

    /* 如果bfile文件实际存在*/

    if (dbms_lob.fileexists(bill_fileloc)!=0)

    then

    /* 打开bfile源文件*/

    dbms_lob.open(bill_fileloc,dbms_lob.readonly);

    /* 打开目标blob*/

    dbms_lob.open(dest_loc,dbms_lob.readwrite);

    /* 从文件中装入*/

    /*dbms_lob.getlength获得文件的大小*/

    dbms_lob.loadfrombile(dest_lob,bill_fileloc,dbms_lob.getlength(bill_fileloc));

    /* 记得关闭*/

    dbms_lob.close(dest_lob);

    dbms_lob.close(bill_fileloc);

    end

    读取大对象数据的过程和函数
       ①:DBMS_LOB.Read():从LOB数据中读取指定长度数据到缓冲区的过程。
          DBMS_LOB.Read(LOB数据,指定长度,起始位置,存储返回LOB类型值变量);
    ②:DBMS_LOB.SubStr():从LOB数据中提取子字符串的函数。
        DBMS_LOB.SubStr(LOB数据,指定提取长度,提取起始位置):

       ③:DBMS_LOB.InStr():从LOB数据中查找子字符串位置的函数。
         DBMS_LOB.InStr(LOB数据, 子字符串);
     ④:DBMS_LOB.GetLength():返回指定LOB数据的长度的函数。
         DBMS_LOB.GetLength(LOB数据);
    ⑤:DBMS_LOB.Compare():比较二个大对象是否相等。返回数值0为相等,-1为不相等。
         DBMS_LOB.Compare(LOB数据,LOB数据);
    操作大对象数据的过程
        操作会改变数据库中原有数据,需要加上Updata锁锁上指定数据列,修改完后提交事务。
         ①:DBMS_LOB.Write():将指定数量的数据写入LOB的过程。
         DBMS_LOB.Write(被写入LOB, 写入长度(指写入LOB数据),写入起始位置(指被写入LOB),写入LOB数据);
       ②:DBMS_LOB.Append():将指定的LOB数据追加到指定的LOB数据后的过程。
         DBMS_LOB.Append(LOB数据,LOB数据);
     ③:DBMS_LOB.Erase():删除LOB数据中指定位置的部分数据的过程;
         DBMS_LOB.Erase(LOB数据,指定删除长度, 开始删除位置);
      ④:DBMS_LOB.Trim():截断LOB数据中从第一位置开始指定长度的部分数据的过程;
         DBMS_LOB.Trim(LOB数据,截断长度);
      ⑤:DBMS_LOB.Copy():从指定位置开始将源LOB复制到目标LOB;
         DBMS_LOB.Copy(源LOB,目标LOB,复制源LOB长度,复制到目标LOB开始位置,复制源LOB开始位置)
  • 相关阅读:
    .ascx
    *.ascx *.asax *.aspx.resx *.asax.resx是什么文件
    DNN Learning How to install 1
    LG7881 [Ynoi2006] rmpq【分块,分治】
    LG6783 [Ynoi2008] rrusq【扫描线,KDT】
    UOJ681【UR #22】月球列车【二进制,Trie】
    AGC056E Cheese【概率期望,dp】
    AGC055F Creative Splitting【双射转化,dp】
    CTT2022 游记
    NOIP2021 退役记
  • 原文地址:https://www.cnblogs.com/lucyawei/p/2864185.html
Copyright © 2020-2023  润新知