Posted on 2010-03-17 23:51
Prayer 閱讀(371)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
數(shù)據(jù)庫(kù),SQL
在多數(shù)情況下,提取循環(huán)中所完成的處理都會(huì)修改由游標(biāo)檢查出的行,PL/SQL提供了進(jìn)行這樣處理的一種語(yǔ)法。
這種語(yǔ)法包括兩部分——在游標(biāo)聲明部分的FOR UPDATE子句和在UPDATE或DELETE語(yǔ)句中的WHERE CURRENT OF 子句。
通常,SELECT操作將不會(huì)對(duì)正處理的行執(zhí)行任何鎖定設(shè)置,這使得連接到該數(shù)據(jù)庫(kù)的其他會(huì)話(huà)可以改變正在選擇的數(shù)據(jù)。
但是,結(jié)果集仍然是一致性的。當(dāng)確定了活動(dòng)集以后,在執(zhí)行OPEN的時(shí)刻,ORACLE會(huì)截取下該表的一個(gè)快照。在此時(shí)刻以前所提交的任何更改操作都會(huì)在活動(dòng)集中反映出來(lái)。在此時(shí)刻以后所進(jìn)行的任何更改操作,即使已經(jīng)提交了它們,都不會(huì)被反映出來(lái),除非將該游標(biāo)重新打開(kāi)。但是使用FOR UPDATE子句,在OPEN返回以前的活動(dòng)集的相應(yīng)行上會(huì)加上互斥鎖,這些鎖會(huì)避免其他的會(huì)話(huà)對(duì)活動(dòng)集中的行進(jìn)行更改。直到整個(gè)事務(wù)被提交為止。
示例:
DECLARE
CURSOR C_CUR IS SELECT * FROM STUDENDS FOR UPDATE OF XM;
BEGIN
OPEN C_CUR;
WHILE C_CUR%FOUND LOOP
UPDATE STUDENDS SET XM='AA'||XM WHERE CURRENT OF C_CUR;
END LOOP;
CLOSE C_CUR;
COMMIT;
END;
需要注意的是:1、UPDATE語(yǔ)句僅更新在游標(biāo)聲明的FOR UPDATE子句處列出的列。如果沒(méi)有列出任何列,那么所有的列都可以更新。
2、示例中的COMMIT是在提取循環(huán)完成以后才完成的,因?yàn)镃OMMIT將釋放由該會(huì)話(huà)持有的所有鎖。因?yàn)镕OR UPDATE子句獲得了鎖,所以COMMIT將釋放這些鎖。當(dāng)鎖釋放了,該游標(biāo)就無(wú)效了。所以后繼的提取操作都將返回ORACLE錯(cuò)誤。