在oracle中,rowid是用于訪問(wèn)數(shù)據(jù),是唯一標(biāo)記表中行的偽列,是表中的每一行數(shù)據(jù)都有一個(gè)唯一的標(biāo)識(shí)符,語(yǔ)法為“select rowid…”;rowid是物理表中行數(shù)據(jù)的內(nèi)部地址,其中一個(gè)是指向數(shù)據(jù)表中包含該行的塊所存放數(shù)據(jù)文件的地址,另一個(gè)是可以直接定位到數(shù)據(jù)行自身的這一行在數(shù)據(jù)塊中的地址。
本教程操作環(huán)境:windows10系統(tǒng)、Oracle 12c版、Dell G3電腦。
oracle中rowid
rowid是一個(gè)用來(lái)唯一標(biāo)記表中行的偽列。它是物理表中行數(shù)據(jù)的內(nèi)部地址,包含兩個(gè)地址,其一為指向數(shù)據(jù)表中包含該行的塊所存放數(shù)據(jù)文件的地址,另一個(gè)是可以直接定位到數(shù)據(jù)行自身的這一行在數(shù)據(jù)塊中的地址。
oracle數(shù)據(jù)庫(kù)的表中的每一行數(shù)據(jù)都有一個(gè)唯一的標(biāo)識(shí)符,或者稱為rowid,在oracle內(nèi)部通常就是使用它來(lái)訪問(wèn)數(shù)據(jù)的。rowid需要 10個(gè)字節(jié)的存儲(chǔ)空間,并用18個(gè)字符來(lái)顯示。該值表明了該行在oracle數(shù)據(jù)庫(kù)中的物理具體位置??梢栽谝粋€(gè)查詢中使用rowid來(lái)表明查詢結(jié)果中包含該值。
AAAR1yAAHAAAAFkAAA為例
這里的AAAR1y是數(shù)據(jù)庫(kù)對(duì)象編號(hào),AAH是文件標(biāo)號(hào),AAAAFk是塊編號(hào),最后三位AAA是行編號(hào)。
使用select * from DEPT; 輸出結(jié)果中是不能看到rowid這里一列的,這是因?yàn)檫@一列只在數(shù)據(jù)庫(kù)內(nèi)部使用,rowid通常被稱為一個(gè)偽列。
如果想選擇
scott.emp的數(shù)據(jù)后進(jìn)行手工修改,則必須使
select rowid,t.* from scott.emp t;
而不能直接寫成
select * from emp;
select rowid,t.* from scott.emp t; select * from scott.emp for update;
在ORACLE中用ROWID來(lái)定位記錄是最快的,比索引還快,所以如果先用SELECT ROWID選出要更新的行,放入COLLECTION中,再用 FORALL UPDATE 來(lái)批量更新可以提高速度。從這點(diǎn)來(lái)講是比其他方法好一點(diǎn)
SELECT FOR UPDATE在更新前會(huì)鎖定記錄,這在復(fù)雜的并行查詢更新程序中是必要的,比如要求數(shù)據(jù)一致性,在過(guò)濾數(shù)據(jù)時(shí)不允許他人改動(dòng)數(shù)據(jù),會(huì)用FOR UPDATE或SET TRANSACTION READ ONLY來(lái)加鎖。另外像 CURSOR里的WHERE CURRENT OF CURSOR語(yǔ)句要求SELECT中必須加FOR UPDATE.
推薦教程:《Oracle視頻教程》