熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

PL/SQL的SELECT FOR UPDATE游標

2013-11-13 22:23:11  來源: Oracle 

  在多數情況下提取循環中所完成的處理都會修改由游標檢查出的行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;
  
  需要注意的是UPDATE語句僅更新在游標聲明的FOR UPDATE子句處列出的列如果沒有列出任何列那麼所有的列都可以更新
  示例中的COMMIT是在提取循環完成以後才完成的因為COMMIT將釋放由該會話持有的所有鎖因為FOR UPDATE子句獲得了鎖所以COMMIT將釋放這些鎖當鎖釋放了該游標就無效了所以後繼的提取操作都將返回ORACLE錯誤
From:http://tw.wingwit.com/Article/program/Oracle/201311/18946.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.