Oracle带blob字段移动0202.docx
- 文档编号:6530360
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:44
- 大小:95.47KB
Oracle带blob字段移动0202.docx
《Oracle带blob字段移动0202.docx》由会员分享,可在线阅读,更多相关《Oracle带blob字段移动0202.docx(44页珍藏版)》请在冰豆网上搜索。
Oracle带blob字段移动0202
Oracle带blob字段移动表空间
2009-05-2709:
50
Oracle表移动表空间:
altertabletb_namemovetablespacetbs_name;
使用上面语句对表做空间迁移时,只能移动非lob字段以外的数据,如果要同时移动lob字段数据,必需改用下面的语句才行:
altertabletb_namemovetablespacetbs_namelob(col_lob1,col_lob2)storeas(tablesapcetbs_name);
建立表空间,赋予表空间权限。
createtablespacetablespace_lobdatafile'd:
\xxx\lob.dbf'size100Mautoextendon;//所有表的lob字段都用一个专用的lob表空间,导出导入数据时方便。
alteruserbbbquotaunlimitedontablespace_lob;//给bbb添加表空间权限。
使用exp和imp导出导入数据时,若含有blob字段,则imp过程中可能由于blob字段表空间不存在而报错。
这时可以先检查源库中blob字段所在表空间名称,然后在目标库中建立同名表空间。
数据导入完成后,可以使用上面语句移动blob数据到指定的表空间。
关于oracle中blob字段的录入问题
-
-
上一篇《oracle中的常用命令重点展播》 下一篇《自动转换Foxpro/Oracle台站数据库的方法》
字体:
小|中|大
在Oracle中,有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob。
下面是对lob数据类型的简单介绍。
blob:
二进制lob,为二进制数据,最长可达4GB,存贮在数据库中。
clob:
字符lob,字符数据,最长可以达到4GB,存贮在数据库中。
bfile:
二进制文件;存贮在数据库之外的只读型二进制数据,最大长度由操作系统限制。
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(
table_nameinvarchar2,
field_idinvarchar2,
field_nameinvarchar2,
v_idinnumber,
v_posinnumber)returnvarchar2
is
loblocclob;
buffervarchar2(32767);
amountnumber:
=2000;
offsetnumber:
=1;
query_strvarchar2(1000);
begin
query_str:
='select'field_name'from'table_name'
where'field_id'=:
id';
--initializebufferwithdatatobefound
EXECUTEIMMEDIATEquery_strINTOloblocUSINGv_id;
offset:
=offset+(v_pos-1)*2000;
--read2000varchar2fromthebuffer
dbms_lob.read(lobloc,amount,offset,buffer);
returnbuffer;
exception
whenno_data_foundthen
returnbuffer;
end;
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
ct_jhdlxbh='1'andct_jhdh=:
ls_jhdhandct_jdlxbh=:
is_jdlx;
ole_1.objectdata=ole_blob
Ifole_1.activate(offsite!
)<0Then
Messagebox("OLEActivate","不能激活")
Return-1
endIf
endif
else
messagebox("提示","没有附件")
endif
endif
(二)在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
Setrs=Nothing
EndSub
PrivateSubcmdsave_Click()
DimrsAsNewADODB.Recordset
rs.ActiveConnection=rn
rs.LockType=adLockOptimistic
rs.CursorLocation=adUseClient
rs.Source="select*fromt_demo"
rs.Open
rs.AddNew
ComDlgDir.DialogTitle="选取文件"
ComDlgDir.ShowOpen
rs.Fields("id").Value=1
IfComDlgDir.filename<""Then
CallFileToBlob(rs.Fields("text"),ComDlgDir.filename)
rs.Update
EndIf
Setrs=Nothing
ExitSub
Setrs=Nothing
EndSub
PrivateSubForm_Load()
IfNotCreateDataSource("sid","systemp","manager")Then
MsgBox"Connectionfailure!
"
EndIf
EndSub
fldAsADODB.Field,filenameAsString,OptionalChunkSizeAs
Long=8192)
DimfnumAsInteger,bytesleftAsLong,bytesAsLong
Dimtmp()AsByte
If(fld.AttributesAndadFldLong)=0Then
Err.Raise1001,,"fielddoesn'tsupporttheGetChunkmethod."
EndIf
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
EndSub
SubBlobToFile(fldAsADODB.Field,filenameA
Oracle11g新特性:
在线操作功能增强
11g中在线处理功能得到了很大增强,其中包括在线修改表结构,在线创建或重建索引,建立不可见索引,表增加非空字段,在线DDL以及对象依赖性细化等。
Www.Syue.Com
在11g以前,DDL操作都要获取对象的排他锁,如果当时无法获取,则会马上报错:
SQL>conn已连接。
SQL>createtablet(idnumber);
表已创建。
SQL>insertintotvalues
(1);
已创建1行。
["岁月联盟"]
在当前会话不提交,保持对t表的锁。
然后在另外的session登陆,尝试对t表进行ddl操作:
SQL>conn已连接。
SQL>setsqlp'SQL2>'
SQL2>truncatetablet;
truncatetablet
*第1行出现错误:
ORA-00054:
资源正忙,但指定以NOWAIT方式获取资源
SQL2>droptablet;
droptablet
*第1行出现错误:
ORA-00054:
资源正忙,但指定以NOWAIT方式获取资源
SQL2>altertabletaddnamevarchar2(10);信息来源"岁月联盟"
altertabletaddnamevarchar2(10)
*第1行出现错误:
ORA-00054:
资源正忙,但指定以NOWAIT方式获取资源
SQL2>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进行同样的处理:
SQL>conn已连接。
SQL>createtablet(idnumber);
表已创建。
SQL>insertintotvalues
(1);
已创建1行。
内容来自"岁月联盟"
登陆第二个会话,发出DDL操作:
SQL2>conn已连接。
SQL2>settimingon
SQL2>truncatetablet;
truncatetablet
*第1行出现错误:
ORA-00054:
资源正忙,但指定以NOWAIT方式获取资源,或者超时失效
已用时间:
00:
00:
00.07
[本文来自"岁月联盟"]
DDL仍然马上报错,这是由于控制DDL等待时间的初始化参数DDL_LOCK_TIMEOUT默认值是0,下面修改这个默认值:
SQL2>altersessionsetddl_lock_timeout=5;
会话已更改。
已用时间:
00:
00:
00.06
SQL2>truncatetablet;
truncatetablet
*第1行出现错误:
ORA-00054:
资源正忙,但指定以NOWAIT方式获取资源,或者超时失效
已用时间:
00:
00:
05.07
内容来自"岁月联盟"
如果在等待时间内第一个会话进行提交,那么DDL就可以获取到排他锁,从而开始操作。
SQL2>altersessionsetddl_lock_timeout=60;
会话已更改。
已用时间:
00:
00:
00.04
SQL2>truncatetablet;
返回会话1进行提交:
SQL>commit;
提交完成。
www.S
会话2在会话1提交后,得到T表的锁,开始TRUNCATE操作:
表被截断。
已用时间:
00:
00:
13.03
SQL2>select*fromv$version;
BANNER
--------------------------------------------------------------------------
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:
00:
00.21
信息来源"岁月联盟"
注意,将DDL_LOCK_TIMEOUT参数设置过大也可能造成潜在的问题,虽然DDL还没有获取到排他锁,不能进行操作,但是它已经在T上增加了锁信息,这会导致后续的DML都会被锁住,直到DDL等
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle blob 字段 移动 0202