Oracle带blob字段移动0202Word文件下载.docx
- 文档编号:19544126
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:44
- 大小:95.47KB
Oracle带blob字段移动0202Word文件下载.docx
《Oracle带blob字段移动0202Word文件下载.docx》由会员分享,可在线阅读,更多相关《Oracle带blob字段移动0202Word文件下载.docx(44页珍藏版)》请在冰豆网上搜索。
二进制文件;
存贮在数据库之外的只读型二进制数据,最大长度由操作系统限制。
nclob:
支持对字节字符集合(nultibytecharacterset)的一个clob列。
对于如何检索和操作这些lob数据一直是oracle数据库开发者经常碰到的问题。
下面我将在oracle对lob数据处理的一些方法和技巧,介绍给读者,希望能够对读者以后的开发有所帮助。
oracle中可以用多种方法来检索或操作lob数据。
通常的处理方法是通过dbms_lob包。
其他的方法包括使用api(applicationprogramminginterfaces)应用程序接口和oci(oraclecallinterface)oracle调用接口程序。
一、在oracle开发环境中我们可以用dbms_lob包来处理!
dbms_lob包功能强大,简单应用。
既可以用来读取内部的lob对象,也可以用来处理bfile对象。
但处理两者之间,还有一点差别。
处理内部lob对象(blob,clob)时,可以进行读和写,但处理外部lob对象bfile时,只能进行读操作,写的操作可以用pl/sql处理。
另外用sql也可以处理lob,但要注重sql仅可以处理整个lob,不能操作lob的数据片。
在dbms_lob包中内建了read(),append,write(),erase(),copy(),getlength(),substr()等函数,可以很方便地操作lob对象。
这里不做深入讨论,读者可以参看相关的书籍。
对于pl/sql,下面介绍一种技巧,用动态的pl/sql语句处理clob对象来传替表名!
example1.
动态PL/SQL,对CLOB字段操作可传递表名table_name,表的唯一标志字段名field_id,clob字段名field_name记录号v_id,开始处理字符的位置v_pos,传入的字符串变量v_clob
修改CLOB的PL/SQL过程:
updateclob
createorreplaceprocedureupdateclob(
table_nameinvarchar2,
field_idinvarchar2,
field_nameinvarchar2,v_idinnumber,
v_posinnumber,
v_clobinvarchar2)
is
loblocclob;
c_clobvarchar2(32767);
amtbinary_integer;
posbinary_integer;
query_strvarchar2(1000);
begin
pos:
=v_pos*32766+1;
amt:
=length(v_clob);
c_clob:
=v_clob;
query_str:
='
select'
field_name'
from'
table_name'
where'
field_id'
=:
idforupdate'
;
--initializebufferwithdatatobeinsertedorupdated
EXECUTEIMMEDIATEquery_strINTOloblocUSINGv_id;
--fromposposition,write32766varchar2intolobloc
dbms_lob.write(lobloc,amt,pos,c_clob);
commit;
exception
whenothersthen
rollback;
end;
l/用法说明:
在插入或修改以前,先把其它字段插入或修改,CLOB字段设置为空empty_clob(),
然后调用以上的过程插入大于2048到32766个字符。
假如需要插入大于32767个字符,编一个循环即可解决问题。
查询CLOB的PL/SQL函数:
getclob
createorreplacefunctiongetclob(
field_nameinvarchar2,
v_idinnumber,
v_posinnumber)returnvarchar2
buffervarchar2(32767);
amountnumber:
=2000;
offsetnumber:
=1;
from'
id'
--initializebufferwithdatatobefound
offset:
=offset+(v_pos-1)*2000;
--read2000varchar2fromthebuffer
dbms_lob.read(lobloc,amount,offset,buffer);
returnbuffer;
whenno_data_foundthen
l用法说明:
用selectgetclob(table_name,field_id,field_name,v_id,v_pos)as
partstrfromdual;
可以从CLOB字段中取2000个字符到partstr中,
编一个循环可以把partstr组合成dbms_lob.getlength(field_name)长度的目标字符串。
二、对于在其他不同的开发环境,例如vc,vb,pb,Java等环境下对lob的处理,处理方法不尽相同,在这里将简要举几个例子来说明不在oracle开发环境下对lob的处理。
(一)在pb中的处理
exampler2.
stringls_path,ls_filename,ls_jhdh
longll_num,ll_count,rtn
blobole_blob
ll_num=dw_lb.getrow()
ifll_num0thenls_jhdh=dw_lb.object.ct_njhdh[ll_num]
selectcount(*)into:
ll_countfromsj_jh_jhfjbwhere
ct_jhdlxbh='
1'
andct_jhdh=:
ls_jhdhandct_jdlxbh=:
is_jdlx;
ifll_count0then
rtn=messagebox("
提示"
"
是否要修改此附件"
question!
yesno!
1)
ifrtn=1then
SELECTBLOBct_jhfjnrINTOle_blobfromsj_jh_jhfjbwhere
ole_1.objectdata=ole_blob
Ifole_1.activate(offsite!
)<
0Then
Messagebox("
OLEActivate"
不能激活"
)
Return-1
endIf
endif
else
messagebox("
没有附件"
(二)在vb中的处理
在vb中处理大对象,一般可以用OO4O(oracleobjectsfor
ole)来处理大对象。
这里介绍一种不用0040处理大对象blob的方法。
下面这段程序可以将一个文件(文本文件,doc文件,图象文件等)保存到数据库中,并可以将其从数据库读出
需要两个commandbutton
cmd1名称cmdsavecaption保存
cmd2名称cmdreadcaption读取
一个cmddialog控件
同时需要创建一张表t_demo(字段id类型number,;
字段text类型blob;
exmple3.
OptionEXPlicit
DimrnAsADODB.Connection
PublicFunctionCreateDataSource(DataSourceAsString,UserID
AsString,PassWordAsString)AsBoolean
OnErrorGoToDbConErr:
Setrn=NewADODB.Connection
Withrn
.ConnectionString="
Provider=OraOledb.Oracle.1;
"
&
_
"
password="
Password&
"
UserID="
UserID&
DataSource="
DataSource&
LocaleIdentifier=2052"
.Open
EndWith
CreateDataSource=True
ExitFunction
DbConErr:
CreateDataSource=False
EndFunction
PrivateSubcmdRead_Click()
DimrsAsNewADODB.Recordset
rs.ActiveConnection=rn
rs.LockType=adLockOptimistic
rs.CursorLocation=adUseClient
rs.Source="
select*fromt_demo"
rs.Open
ComDlgDir.DialogTitle="
保存文件"
ComDlgDir.Filter="
*.*"
ComDlgDir.ShowSave
CallBloBToFile(rs.Fields("
text"
),ComDlgDir.filename)
Setrs=Nothing
ExitSub
EndSub
PrivateSubcmdsave_Click()
rs.AddNew
选取文件"
ComDlgDir.ShowOpen
rs.Fields("
id"
).Value=1
IfComDlgDir.filename<
Then
CallFileToBlob(rs.Fields("
rs.Update
EndIf
PrivateSubForm_Load()
IfNotCreateDataSource("
sid"
"
systemp"
manager"
)Then
MsgBox"
Connectionfailure!
"
fldAsADODB.Field,filenameAsString,OptionalChunkSizeAs
Long=8192)
DimfnumAsInteger,bytesleftAsLong,bytesAsLong
Dimtmp()AsByte
If(fld.AttributesAndadFldLong)=0Then
Err.Raise1001,,"
fielddoesn'
tsupporttheGetChunkmethod."
IfDir$(filename)="
ThenErr.Raise53,,"
Filenotfound"
fnum=FreeFile
OpenfilenameForBinaryAsfnum
bytesleft=LOF(fnum)
DoWhilebytesleft
bytes=bytesleft
IfbytesChunkSizeThenbytes=ChunkSize
ReDimtmp(1Tobytes)AsByte
Getfnum,,tmp
fld.AppendChunktmp
bytesleft=bytesleft-bytes
Loop
Close#fnum
SubBlobToFile(fldAsADODB.Field,filenameA
Oracle11g新特性:
在线操作功能增强
11g中在线处理功能得到了很大增强,其中包括在线修改表结构,在线创建或重建索引,建立不可见索引,表增加非空字段,在线DDL以及对象依赖性细化等。
Www.Syue.Com
在11g以前,DDL操作都要获取对象的排他锁,如果当时无法获取,则会马上报错:
SQL>
conn已连接。
createtablet(idnumber);
表已创建。
insertintotvalues
(1);
已创建1行。
["
岁月联盟"
]
在当前会话不提交,保持对t表的锁。
然后在另外的session登陆,尝试对t表进行ddl操作:
setsqlp'
SQL2>
'
SQL2>
truncatetablet;
truncatetablet
*第1行出现错误:
ORA-00054:
资源正忙,但指定以NOWAIT方式获取资源
droptablet;
droptablet
altertabletaddnamevarchar2(10);
信息来源"
altertabletaddnamevarchar2(10)
select*fromv$version;
BANNER
----------------------------------------------------------------
Database10gEnterpriseEditionRelease10.2.0.1.0-Prod
PL/SQLRelease10.2.0.1.0-Production
CORE10.2.0.1.0Production
TNSfor32-bit:
Version10.2.0.1.0-Production
NLSRTLVersion10.2.0.1.0-Production
这就是11g以前的DDL处理方式,在11g中,用户可以为DDL设置一个等待时间,这样DDL在获取不到排他锁时,会根据设置等待相应的时间,如果到时仍然获取不到锁,那么才会报错。
["
]
登陆11g进行同样的处理:
内容来自"
登陆第二个会话,发出DDL操作:
settimingon
资源正忙,但指定以NOWAIT方式获取资源,或者超时失效
已用时间:
00:
00.07
[本文来自"
DDL仍然马上报错,这是由于控制DDL等待时间的初始化参数DDL_LOCK_TIMEOUT默认值是0,下面修改这个默认值:
altersessionsetddl_lock_timeout=5;
会话已更改。
00.06
05.07
如果在等待时间内第一个会话进行提交,那么DDL就可以获取到排他锁,从而开始操作。
altersessionsetddl_lock_timeout=60;
00.04
返回会话1进行提交:
commit;
提交完成。
www.S
会话2在会话1提交后,得到T表的锁,开始TRUNCATE操作:
表被截断。
13.03
--------------------------------------------------------------------------
Database11gEnterpriseEditionRelease11.1.0.6.0-ProductionPL/SQLRelease11.1.0.6.0-Production
CORE11.1.0.6.0Production
TNSforLinux:
Version11.1.0.6.0-Production
NLSRTLVersion11.1.0.6.0-Production
00.21
信息来源"
注意,将DDL_LOCK_TIMEOUT参数设置过大也可能造成潜在的问题,虽然DDL还没有获取到排他锁,不能进行操作,但是它已经在T上增加了锁信息,这会导致后续的DML都会被锁住,直到DDL等
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle blob 字段 移动 0202
![提示](https://static.bdocx.com/images/bang_tan.gif)