oracle.for update,更新遊標,cursor____oracle
來源:互聯網
上載者:User
2007/6/1
oracle dml select for update syntax examples 在多數情況下,提取迴圈中所完成的處理都會修改由遊標檢查出的行,PL/SQL提供了進行這樣處理的一種文法。
這種文法包括兩部分——在遊標聲明部分的FOR UPDATE子句和在UPDATE或DELETE語句中的WHERE CURRENT OF 子句。
通常,SELECT操作將不會對正處理的行執行任何鎖定設定,這使得串連到該資料庫的其他會話可以改變正在選擇的資料。
但是,結果集仍然是一致性的。當確定了活動集以後,在執行OPEN的時刻,ORACLE會截取下該表的一個快照。在此時刻以前所提交的任何更改操作都會在活動集中反映出來。在此時刻以後所進行的任何更改操作,即使已經提交了它們,都不會被反映出來,除非將該遊標重新開啟。但是使用FOR UPDATE子句,在OPEN返回以前的活動集的相應行上會加上互斥鎖,這些鎖會避免其他的會話對活動集中的行變更。直到整個事務被提交為止。
樣本:
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語句僅更新在遊標聲明的FOR UPDATE子句處列出的列。如果沒有列出任何列,那麼所有的列都可以更新。
2、樣本中的COMMIT是在提取迴圈完成以後才完成的,因為COMMIT將釋放由該會話持有的所有鎖。因為FOR UPDATE子句獲得了鎖,所以COMMIT將釋放這些鎖。當鎖釋放了,該遊標就無效了。所以後繼的提取操作都將返回ORACLE錯誤。 來自: http://u2uu2u.spaces.live.com/Blog/cns!D9788D4C792D64AB!795.entry