Oracle数据库中的blob类型解析
Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。
一:Oracle中的LOB数据类型分类
2,按存储方式分:
/* conn scott/tiger; Create TableSpace ts5_21 DataFile 'E:\Oracle\ts5_21.dbf' Size 5m; */
Create Table tLob ( no Number(4), name VarChar2(10), resume CLob, photo BLob, record BFile )
Lob (resume,photo)Store As ( Tablespace ts5_21 Chunk 6k Disable Storage In Row );
(Tablespace ts5_21 --指定存储的表空间 Chunk 6k --指定数据块大小)
②遇到大对象列时,插入空白构造函数。 字符型:empty_clob(),empty_nclob() 二进制型:empty_blob() 二进制文件类型:BFileName函数指向外部文件。 BFileName函数: BFileName(‘逻辑目录名’,‘文件名’); 逻辑目录名只能大写,因为数据词典是以大写方式存储。Oracle是区分大小写的。 在创建时,无需将BFileName函数逻辑目录指向物理路径,使用时才做检查二者是否关联。 例子: Insert Into tLob Values(1,'Gene',empty_clob(),empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
③将逻辑目录和物理目录关联。(如果是二进制文件类型) 授予 CREATE ANY DIRECTORY 权限 Grant CREATE ANY DIRECTORY TO 用户名 WITH ADMIN OPTION; 关联逻辑目录和物理目录 本地 Create Directory 逻辑目录名 As ‘文件的物理目录’; 网络: Create Directory 逻辑目录名 As ‘\\主机名(IP)\共享目录’; 例子: Create Directory MYDIR As 'E:\Oracle';
插入例子: insert into tlob values(1,'Gene','CLOB大对象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
/* insert into tlob values(1,'Gene','CLOB大对象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
insert into tlob values(2,'Jack','CLOB大对象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
insert into tlob values(3,'Mary','大对象列CLOB',empty_blob(),bfilename('MYDIR','IMG_0210.JPG')); */
1,读取大对象数据的过程和函数
①:DBMS_LOB.Read():从LOB数据中读取指定长度数据到缓冲区的过程。 DBMS_LOB.Read(LOB数据,指定长度,起始位置,存储返回LOB类型值变量); 例子:
Declare
varC clob;
vRStr varchar2(1000);
ln number(4);
Strt number(4);
Begin
select resume into varC from tlob where no = 1;
ln := DBMS_LOB.GetLength(varC);
Strt := 1;
DBMS_LOB.Read(varC, ln, Strt, vRStr);
DBMS_output.put_line('Return: '||vRStr);
End;
②:DBMS_LOB.SubStr():从LOB数据中提取子字符串的函数。 DBMS_LOB.SubStr(LOB数据,指定提取长度,提取起始位置): 例子:
Declare
varC clob;
vRStr varchar2(1000);
ln number(4);
Strt number(4);
Begin
select resume into varC from tlob where no = 1;
ln := 4;
Strt := 1;
vRStr := DBMS_LOB.SubStr(varC, ln, Strt);
DBMS_output.put_line('结果为: '||vRStr);
End;
③:DBMS_LOB.InStr():从LOB数据中查找子字符串位置的函数。 DBMS_LOB.InStr(LOB数据, 子字符串); 例子:
Declare
varC clob;
vSubStr varchar2(1000);
vRStr varchar2(1000);
ln number(4);
Begin
select resume into varC from tlob where no = 1;
vSubStr := '大对象';
ln := DBMS_LOB.InStr(varC,vSubStr);
DBMS_output.put_line('位置为: '||ln);
vRStr := DBMS_LOB.SubStr(varC, Length(vSubStr), ln);
DBMS_output.put_line('位置为'||ln||'长度为'||Length(vSubStr)||'的子字符串为:'||vRStr);
End;
④:DBMS_LOB.GetLength():返回指定LOB数据的长度的函数。 DBMS_LOB.GetLength(LOB数据);
⑤:DBMS_LOB.Compare():比较二个大对象是否相等。返回数值0为相等,-1为不相等。 DBMS_LOB.Compare(LOB数据,LOB数据); 例子:
Declare
varC1 clob;
varC2 clob;
varC3 clob;
ln number(4);
Begin
select resume into varC1 from tlob where no = 1;
select resume into varC2 from tlob where no = 2;
select resume into varC3 from tlob where no = 3;
ln := DBMS_LOB.Compare(varC1,varC1);
DBMS_output.put_line('比较的结果为: '||ln);
ln := DBMS_LOB.Compare(varC2,varC3);
DBMS_output.put_line('比较的结果为: '||ln);
End;
2,操作大对象数据的过程 操作会改变数据库中原有数据,需要加上Updata锁锁上指定数据列,修改完后提交事务。
①:DBMS_LOB.Write():将指定数量的数据写入LOB的过程。 DBMS_LOB.Write(被写入LOB, 写入长度(指写入LOB数据),写入起始位置(指被写入LOB),写入LOB数据); 例子:
Declare
varC clob;
vWStr varchar2(1000);
vStrt number(4);
ln number(4);
Begin
vWStr := 'CLOB';
ln := Length(vWStr);
vStrt := 5;
select resume into varC from tlob where no = 1 FOR UPDATE; DBMS_LOB.Write(varC, ln, vStrt, vWStr);
DBMS_output.put_line('改写结果为: '||varC);
Commit;
End;
②:DBMS_LOB.Append():将指定的LOB数据追加到指定的LOB数据后的过程。 DBMS_LOB.Append(LOB数据,LOB数据); 例子:
Declare
varC clob;
vAStr varchar2(1000);
Begin
vAStr := ',这是大对象列';
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Append(varC, vAStr); commit;
DBMS_output.put_line('追加结果为: '||varC);
End;
③:DBMS_LOB.Erase():删除LOB数据中指定位置的部分数据的过程; DBMS_LOB.Erase(LOB数据,指定删除长度, 开始删除位置); 例子:
Declare
varC clob;
ln number(4);
strt number(4);
Begin
ln := 1;
strt := 5;
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Erase(varC, ln, strt);
commit;
DBMS_output.put_line('擦除结果为: '||varC);
End;
④:DBMS_LOB.Trim():截断LOB数据中从第一位置开始指定长度的部分数据的过程; DBMS_LOB.Trim(LOB数据,截断长度); 例子:
Declare
varC clob;
ln number(4);
Begin
ln := 4;
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Trim(varC, ln);
COMMIT; DBMS_output.put_line('截断结果为: '||varC);
End;
⑤:DBMS_LOB.Copy():从指定位置开始将源LOB复制到目标LOB; DBMS_LOB.Copy(源LOB,目标LOB,复制源LOB长度,复制到目标LOB开始位置,复制源LOB开始位置) 例子:
Declare
vDEST_LOB clob; vSRC_LOB clob;
AMOUNT number; DEST_OFFSET number;
SRC_OFFSET number;
Begin
select resume into vDEST_LOB from tlob where no = 1 FOR UPDATE;
select resume into vSRC_LOB from tlob where no = 2 ;
AMOUNT := DBMS_LOB.GetLength(vSRC_LOB);
DEST_OFFSET := DBMS_LOB.GetLength(vDEST_LOB)+1;
SRC_OFFSET := 1;
DBMS_LOB.Copy(vDEST_LOB, vSRC_LOB, AMOUNT, DEST_OFFSET, SRC_OFFSET);
DBMS_output.put_line('拷贝结果为: '||vDEST_LOB);
End;
Oracle数据库中的blob类型解析的更多相关文章
- Java读取oracle数据库中blob字段数据文件保存到本地文件(转载)
转自:https://www.cnblogs.com/forever2698/p/4747349.html package com.bo.test; import java.io.FileOutput ...
- Oracle数据库中字段定义为Char类型,Hibernate用该字段进行动态绑定参数查询,获取不到结果的问题
一.问题背景 产生环境:oracle数据库,hibernate操作 定义了一个表 create table STORE_INFORMATION ( id CHAR(32) not null, name ...
- 数据库中的blob是什么类型?
数据库中的blob是什么类型? BLOB (binary large object)----二进制大对象,是一个可以存储二进制文件的容器. 在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类 ...
- Oracle数据库中的变量
Oracle数据库中的变量 来源:https://blog.csdn.net/wahaa591/article/details/46772769 1.define(即host变量) define va ...
- --关于null在oracle数据库中是否参与计算,进行验证,
--关于null在oracle数据库中是否参与计算,进行验证,with td as (select null id,1 name from dual ),td1 as ( select null id ...
- 配置NHibernate将枚举保存为Oracle数据库中的字符串
假设有这样一个枚举: /// <summary> /// 字典项类型 /// </summary> public enum DicItemType { [EnumDescrip ...
- oracle数据库中提供的5种约束
约束作用:用来保持数据的完整性,防止无效数据进入到数据库中.oracle数据库中提供的5种约束,都是限定某个列或者列的组合的.1.主键约束(PRIMARY KEY):在一个表中能唯一的标识一行.主键可 ...
- Oracle 数据库中日期时间的插入操作
Oracle 中如何插入日期时间类型的数据,首先为了演示, 新建数据表如下 create table t( mydate date); 插入日期时间 SQL> insert into t val ...
- C#实现MySQL数据库中的blob数据存储
在MySQL数据库中,有一种blob数据类型,用来存储文件.C#编程语言操作MySQL数据库需要使用MySQL官方组件MySQL.Data.dll. Mysql.Data.dll(6.9.6)组件下载 ...
随机推荐
- Windows Server 2012从Evaluation版转成正式版
步骤 运行->CMD(管理员)->输入DISM /online /Get-CurrentEdition 看你的Edition ID是什么,如果是Evaluation的话,例如Standar ...
- phpcms v9 分页
phpcms的分页很简单,只需在需要分页的地方写入如下代码即可: <div id="pages">{$pages}</div> 连样式都有了,如果你是调用的 ...
- phpcms v9教程 联动搜索在房地产网站开发中的应用
开发简述:使用phpcms v9系统,修改源文件5个,创建模型:楼盘.出售.出租.中介.小区,增加联动菜单:楼盘,增加用户组:房产中介.实现功能:游客发布信息.会员申请中介.楼盘全方位展示.报名团购. ...
- mongodb学习(1) 第一次开启 mongdb
1.启动mongdb 可以设置为开机启动 mongod -dbpath=/data/mongodb --fork --port 27017 --logpath=/usr/local/mongodb/l ...
- Swift—final关键字-b
在类的定义中使用final关键字声明类.属性.方法和下标.final声明的类不能被继承,final声明的属性.方法和下标不能被重写. 下面看一个示例: final class Person { //声 ...
- 浅谈C51内存优化
对 51 单片机内存的认识,很多人有误解,最常见的是以下两种 超过变量128后必须使用compact模式编译,实际的情况是只要内存占用量不超过 256.0 就可以用 small 模式编译 128以上的 ...
- perl 安装AnyEvent::HTTP
perl 版本 ActivePerl_5.16.2.msi
- poj3237 Tree
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
- HDU_2044——蜜蜂走蜂房,递推
Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input 输入数据的 ...
- HDU_2034——集合A-B
Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法 ...