一個從事資料庫遷移的老手的的筆記之一(Oracle對BLOB型別資料的操作與效能問題)
Oracle對BLOB型別資料的操作與效能問題
該筆記摘取在在遷移上海市某某專案系統中異構、跨平臺、跨資料模型、跨資料庫廠家的資料遷移過程中的內容。
時間:2010年上海世博會前後
Oracle的Blob欄位比較特殊,他比long欄位的效能要好很多,可以用來儲存例如圖片之類的二進位制資料。
寫入Blob欄位和寫入其它型別欄位的方式非常不同,因為Blob自身有一個cursor,你必須使用cursor對blob進行操作,因而你在寫入Blob之前,必須獲得cursor才能進行寫入,那麼如何獲得Blob的cursor呢?
這需要你先插入一個empty的blob,這將建立一個blob的cursor,然後你再把這個empty的blob的cursor用select查詢出來,這樣透過兩步操作,你就獲得了blob的cursor,可以真正的寫入blob資料了。
舉例如下:
Oracle系列:LOB大物件處理
主要是用來儲存大量資料的資料庫欄位,最大可以儲存4G位元組的非結構化資料。
主要介紹字元型別和二進位制檔案型別LOB資料的儲存,單獨介紹二進位制型別LOB資料的儲存。
寫入Blob欄位和寫入其它型別欄位的方式非常不同,因為Blob自身有一個cursor,你必須使用cursor對blob進行操作,因而你在寫入Blob之前,必須獲得cursor才能進行寫入,那麼如何獲得Blob的cursor呢?
這需要你先插入一個empty的blob,這將建立一個blob的cursor,然後你再把這個empty的blob的cursor用select查詢出來,這樣透過兩步操作,你就獲得了blob的cursor,可以真正的寫入blob資料了。
舉例如下:
Oracle系列:LOB大物件處理
主要是用來儲存大量資料的資料庫欄位,最大可以儲存4G位元組的非結構化資料。
主要介紹字元型別和二進位制檔案型別LOB資料的儲存,單獨介紹二進位制型別LOB資料的儲存。
一,Oracle中的LOB資料型別分類
1,按儲存資料的型別分:
①字元型別:
CLOB:儲存大量 單位元組 字元資料。
NLOB:儲存定寬 多位元組 字元資料。
②二進位制型別:
BLOB:儲存較大無結構的二進位制資料。
③二進位制檔案型別:
BFILE:將二進位制檔案儲存在資料庫外部的作業系統檔案中。存放檔案路徑。
1,按儲存資料的型別分:
①字元型別:
CLOB:儲存大量 單位元組 字元資料。
NLOB:儲存定寬 多位元組 字元資料。
②二進位制型別:
BLOB:儲存較大無結構的二進位制資料。
③二進位制檔案型別:
BFILE:將二進位制檔案儲存在資料庫外部的作業系統檔案中。存放檔案路徑。
2,按儲存方式分:
①儲存在內部表空間:
CLOB,NLOB和BLOB
②指向外部作業系統檔案:
BFILE
①儲存在內部表空間:
CLOB,NLOB和BLOB
②指向外部作業系統檔案:
BFILE
二,大物件資料的錄入
1,宣告LOB型別列
/*
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
);
2,插入大物件列
①先插入普通列資料
1,宣告LOB型別列
/*
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
);
2,插入大物件列
①先插入普通列資料
②遇到大物件列時,插入空白建構函式。
字元型: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';
字元型: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'));
三,大物件資料的讀取和操作:DBMS_LOB包
DBMS_LOB包:包含處理大物件的過程和函式
/*
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型別值變數);
②: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資料);
例子:
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資料);
②: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開始位置)
DBMS_LOB包:包含處理大物件的過程和函式
/*
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型別值變數);
②: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資料);
例子:
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資料);
②: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開始位置)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29267792/viewspace-1815324/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle對BLOB型別資料的操作與效能問題(轉載)Oracle型別
- Oracle資料庫中對BLOB資料的操作問題Oracle資料庫
- 海量資料遷移之一個誤操作的問題總結
- Oracle資料庫遷移之一:RMANOracle資料庫
- Android 資料庫綜述(一) 資料庫片的升級與資料的遷移操作Android資料庫
- MySQL 資料庫的對庫的操作及其資料型別悔鋒MySql資料庫資料型別
- 《卸甲筆記》-PostgreSQL和Oracle的資料型別的對比系列四:大資料型別筆記SQLOracle資料型別大資料
- PHP 操作 mysql blob 資料型別的欄位PHPMySql資料型別
- Laravel5的資料庫表建立問題 資料庫遷移操作報錯問題解決Laravel資料庫
- 聊聊國產資料庫遷移中的表連線效能問題資料庫
- oracle xtts資料庫遷移方法測試之一OracleTTS資料庫
- 檔案插入 Oracle資料庫 Blob型別Oracle資料庫型別
- 解決Oracle資料庫遷移後的伺服器負載效能問題JSOracle資料庫伺服器負載JS
- 關於Oracle資料庫中行遷移/行連結的問題Oracle資料庫
- 《卸甲筆記》-PostgreSQL和Oracle的資料型別的對比系列五:其它型別筆記SQLOracle資料型別
- 資料庫遷移的幾個方式資料庫
- 遷移資料庫資料考慮問題資料庫
- 資料遷移中的幾個問題總結
- Long型別的資料,利用COPY命令遷移型別
- GoldenGate資料遷移的問題總結(一)Go
- hive學習筆記之一:基本資料型別Hive筆記資料型別
- Java 支援的資料型別與 MySQL 支援的資料型別對比Java資料型別MySql
- java語言操作Oracle資料庫中的CLOB資料型別 (轉)JavaOracle資料庫資料型別
- 使用資料泵遷移遇到的問題
- Oracle BLOB型別的資料如何檢視和下載?Oracle型別
- 資料庫-oracle-資料庫遷移資料庫Oracle
- oracle資料庫事務transaction 不同的鎖lock型別Oracle資料庫型別
- ORACLE資料庫遷移Oracle資料庫
- Oracle資料庫資料遷移流程Oracle資料庫
- 一次資料庫上雲遷移效能下降的排查資料庫
- MySQL資料庫int型別的那些事MySql資料庫型別
- 同版本的庚頓實時資料庫的資料遷移操作步驟資料庫
- C++的那些事:資料與型別C++型別
- 動態效能檢視與資料字典的區別之一
- 資料遷移(MYSQL--ORACLE)中碰到的亂碼問題MySqlOracle
- Oracle資料庫升級或資料遷移的方法探討Oracle資料庫
- 資料庫檔案的遷移資料庫
- 資料遷移中需要考慮的問題