在多數(shù)情況下,提取循環(huán)中所完成的處理都會修改由游標(biāo)檢查出的行,PL/SQL提供了進(jìn)行這樣處理的一種語法。 這種語法包括兩部分——在游標(biāo)聲明部分的FOR UPDATE子句和在UPDATE或DELETE語句中的WHERE CURRENT OF 子句。 通常,SELECT操作將不會對正處理的行執(zhí)行任何鎖定設(shè)置,這使得連接到該數(shù)據(jù)庫的其他會話可以改變正在選擇的數(shù)據(jù)。 但是,結(jié)果集仍然是一致性的。當(dāng)確定了活動集以后,在執(zhí)行OPEN的時刻,Oracle會截取下該表的一個快照。在此時刻以前所提交的任何更改操作都會在活動集中反映出來。在此時刻以后所進(jìn)行的任何更改操作,即使已經(jīng)提交了它們,都不會被反映出來,除非將該游標(biāo)重新打開。但是使用FOR UPDATE子句,在OPEN返回以前的活動集的相應(yīng)行上會加上互斥鎖,這些鎖會避免其他的會話對活動集中的行進(jìn)行更改。直到整個事務(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;