Oracle中LOB 处理
主要是用來(lái)存儲(chǔ)大量數(shù)據(jù)的數(shù)據(jù)庫(kù)字段,最大可以存儲(chǔ)4G字節(jié)的非結(jié)構(gòu)化數(shù)據(jù)。主要介紹字符類型和二進(jìn)制文件類型LOB數(shù)據(jù)的存儲(chǔ),單獨(dú)
三,大對(duì)象數(shù)據(jù)的讀取和操作:DBMS_LOB包
DBMS_LOB包:包含處理大對(duì)象的過(guò)程和函數(shù)
/*
insert into tlob values(1,'Gene','CLOB大對(duì)象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
insert into tlob values(2,'Jack','CLOB大對(duì)象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
insert into tlob values(3,'Mary','大對(duì)象列CLOB',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
*/
1,讀取大對(duì)象數(shù)據(jù)的過(guò)程和函數(shù)
①:DBMS_LOB.Read():從LOB數(shù)據(jù)中讀取指定長(zhǎng)度數(shù)據(jù)到緩沖區(qū)的過(guò)程。
DBMS_LOB.Read(LOB數(shù)據(jù),指定長(zhǎng)度,起始位置,存儲(chǔ)返回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數(shù)據(jù)中提取子字符串的函數(shù)。
DBMS_LOB.SubStr(LOB數(shù)據(jù),指定提取長(zhǎng)度,提取起始位置):
例子:
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('結(jié)果為: '||vRStr);
End;
③:DBMS_LOB.InStr():從LOB數(shù)據(jù)中查找子字符串位置的函數(shù)。
DBMS_LOB.InStr(LOB數(shù)據(jù), 子字符串);
例子:
Declare
varC clob;
vSubStr varchar2(1000);
vRStr varchar2(1000);
ln number(4);
Begin
select resume into varC from tlob where no = 1;
vSubStr := '大對(duì)象';
ln := DBMS_LOB.InStr(varC,vSubStr);
DBMS_output.put_line('位置為: '||ln);
vRStr := DBMS_LOB.SubStr(varC, Length(vSubStr), ln);
DBMS_output.put_line('位置為'||ln||'長(zhǎng)度為'||Length(vSubStr)||'的子字符串為:'||vRStr);
End;
④:DBMS_LOB.GetLength():返回指定LOB數(shù)據(jù)的長(zhǎng)度的函數(shù)。
DBMS_LOB.GetLength(LOB數(shù)據(jù));
⑤:DBMS_LOB.Compare():比較二個(gè)大對(duì)象是否相等。返回?cái)?shù)值0為相等,-1為不相等。
DBMS_LOB.Compare(LOB數(shù)據(jù),LOB數(shù)據(jù));
例子:
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('比較的結(jié)果為: '||ln);
ln := DBMS_LOB.Compare(varC2,varC3);
DBMS_output.put_line('比較的結(jié)果為: '||ln);
End;
2,操作大對(duì)象數(shù)據(jù)的過(guò)程
操作會(huì)改變數(shù)據(jù)庫(kù)中原有數(shù)據(jù),需要加上Updata鎖鎖上指定數(shù)據(jù)列,修改完后提交事務(wù)。
①:DBMS_LOB.Write():將指定數(shù)量的數(shù)據(jù)寫入LOB的過(guò)程。
DBMS_LOB.Write(被寫入LOB, 寫入長(zhǎng)度(指寫入LOB數(shù)據(jù)),寫入起始位置(指被寫入LOB),寫入LOB數(shù)據(jù));
例子:
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('改寫結(jié)果為: '||varC);
Commit;
End;
②:DBMS_LOB.Append():將指定的LOB數(shù)據(jù)追加到指定的LOB數(shù)據(jù)后的過(guò)程。
DBMS_LOB.Append(LOB數(shù)據(jù),LOB數(shù)據(jù));
例子:
Declare
varC clob;
vAStr varchar2(1000);
Begin
vAStr := ',這是大對(duì)象列';
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Append(varC, vAStr);
commit;
DBMS_output.put_line('追加結(jié)果為: '||varC);
End;
③:DBMS_LOB.Erase():刪除LOB數(shù)據(jù)中指定位置的部分?jǐn)?shù)據(jù)的過(guò)程;
DBMS_LOB.Erase(LOB數(shù)據(jù),指定刪除長(zhǎng)度, 開(kāi)始刪除位置);
例子:
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('擦除結(jié)果為: '||varC);
End;
④:DBMS_LOB.Trim():截?cái)郘OB數(shù)據(jù)中從第一位置開(kāi)始指定長(zhǎng)度的部分?jǐn)?shù)據(jù)的過(guò)程;
DBMS_LOB.Trim(LOB數(shù)據(jù),,截?cái)嚅L(zhǎng)度);
例子:
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('截?cái)嘟Y(jié)果為: '||varC);
End;
⑤:DBMS_LOB.Copy():從指定位置開(kāi)始將源LOB復(fù)制到目標(biāo)LOB;
DBMS_LOB.Copy(源LOB,目標(biāo)LOB,復(fù)制源LOB長(zhǎng)度,復(fù)制到目標(biāo)LOB開(kāi)始位置,復(fù)制源LOB開(kāi)始位置)
例子:
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('拷貝結(jié)果為: '||vDEST_LOB);
End;
總結(jié)
以上是生活随笔為你收集整理的Oracle中LOB 处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: arma模型_R语言与计量经济学(七)A
- 下一篇: js string转number_Nod