Erp100论坛's Archiver

xiangzhao 发表于 2008-7-12 16:00

解释 select for update 的意思

我需要修改某一个数据,在PL/SQL Developer里,首先执行select .... for update,锁定某一行,点击 EDIT DATA 按纽,手工修改数据,执行COMMIT。
但是好象并没有更改数据,再执行select ....,跳出对话框,说什么 "post change record  ..."(具体什么没注意),我点“是”,然后COMMIT按纽又变绿了,再次COMMIT才能更新数据。

这里我就不明白了,为什么要commit两次?

xiangzhao 发表于 2008-7-12 16:00

SELECT  FOR  UPDATE  光标
为了对正在处理(查询) 的行不被另外的用户改动,oracle 提供一个 FOR UPDATE 子句来对所选择的行进行锁住。语法如下:
SELECT . . . FROM  FOR UPDATE [OF column_reference] [NOWAIT]

如果另一个会话已对活动集中的行加了锁,那么 SELECT  FOR UPDATE操作一直等待到其它的会话释放这些锁后才继续自己的操作,对于这种情况,如果加 NOWAIT 子句,如果这些行真的被另一个会话锁定,则OPEN 立即返回并给出:
ORA-0054 :resource busy  and  acquire with NOWAIT specified.

     如果 使用 FOR UPDATE 声明光标,则可在delete, update 语句中使用WHERE CURRENT OF 子句。

例6:
--节选自在线代码  forupdate.sql
DECLARE

   V_NumCreadits  classes.num_creadits%TYPE;
  CURSOR  c_RegisteredStudents  IS
     SELECT *  FROM students  
          WHERE  is  IN ( SELECT student_id from registered_students
                      WHERE department = ‘HIS’ AND course = 101 )
          FOR UPDATE OF current_credits;

BEGIN

     FOR  v_Studentinfo  IN c_RegisteredStudents  LOOP
      SELECT  num_credits  INTO v_numcredits  FROM  classes
       WHERE  department =’HIS’  AND  course=101;

     UPDATE  students
         SET  current_credits = current_credits + v_numcredits
        WHERE  CURRENT OF c_RegusteredStudents;
     END LOOP;

COMMIT;
END;

xiangzhao 发表于 2008-7-12 16:00

你就当它是个确定按钮,如果用FOR UPDATE更新,一般得步骤是:
执行语句--锁--修改,插入--勾--解锁--提交

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2007 Comsenz Inc.