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)组件下载 ...
随机推荐
- 关于webApi302跳转的问题
之前会出现"服务器无法在已发送 HTTP 标头之后设置状态"的问题,本地调试不报错,但是上产线就会报错 解决的思路是: var response = Request.CreateR ...
- javascript DOM对象转jquery对象
首先,假设一种情形:要在HTML文件中为一个select对象添加一个函数,这个函数的名字叫dynamic_change(this),当select的option被改变的时候调用onchange事件来处 ...
- shell脚本实现仅保留某目录下最新的两个文件
#!/bin/sh export DS_DIR=/home/cxy/test if [ ! -d $DS_DIR ]; then mkdir $DS_DIR else echo "$DS_D ...
- Android 解决服务端验证码问题
服务端验证码解决方法. 在服务端生成验证码后会把验证码字符串存在服务端的session中,等待用户提交进行比对.为了保证服务器与客户端的一对一的关系,所以出现了session 和cookie技术.客户 ...
- MCS-51单片机的指令时序
时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍.状态.机器周期和指令周期,接下来我们分别加以说明. 节拍与状态: 我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示), ...
- Qt之模型/视图(自定义按钮)(重绘QStyleOptionButton)
http://blog.csdn.net/liang19890820/article/details/50974059#comments
- Sublime Text2不自动打开最近的项目
1.首选项 2.设置默认 "hot_exit": false, "remember_open_files": false, 这两个值改成false就可以了
- head命令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...
- libvirtsAPI
mongodb远程服务器连接 mongo -uroot -p321 master.puppet.org:27017/admin
- ORA-00314,redolog 损坏,或丢失处理方法
alertsid.log报错信息: Fri Sep 27 15:18:39 2013 Started redo scan Fri Sep 27 15:18:39 2013 Errors in file ...