博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle ——lob对象 /bfile 字段
阅读量:4994 次
发布时间:2019-06-12

本文共 2449 字,大约阅读时间需要 8 分钟。

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'67 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开始位置)

 

转载于:https://www.cnblogs.com/lucyawei/archive/2013/01/17/2864185.html

你可能感兴趣的文章
CentOS7 监控网络流量
查看>>
根据控件名称反射查找控件
查看>>
编写和执行C#代码的插件:CS-Script for Notepad++
查看>>
BZOJ3569: DZY Loves Chinese II(线性基构造)
查看>>
Android系统源码下载及使用(Android 14到19源码)
查看>>
绑定dropdownlist
查看>>
[LeetCode] Sudoku Solver
查看>>
实验四
查看>>
Python Day04
查看>>
Android新增API之AudioEffect中文API与应用实例
查看>>
颜色空间RGB与HSV(HSL)的转换
查看>>
swift 用协议实现代理传值功能
查看>>
深入懂得android view 生命周期
查看>>
android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
查看>>
Android 中 更新视图的函数ondraw() 和dispatchdraw()的区别
查看>>
《Java源码解析》之NIO的Selector机制(Part1:Selector.open())
查看>>
webpack安装问题
查看>>
Qt学习记录--Qt::CaseSensitive
查看>>
你的灯还亮着吗阅读笔记之一
查看>>
python介绍
查看>>