PL/SQL 中的当前位置

WHERE CURRENT OF in PL/SQL

  1. 为什么我们需要 Oracle PL/SQL 中的 WHERE CURRENT OF 子句?我们都知道 FETCH 一次只检索一行,因此 FETCHLOOP 中用于处理游标的所有行。那为什么我们只需要一个 WHERE CURRENT OF 子句呢?我们无论如何都可以使用 FOR UPDATEFOR UPDATE OF.

  2. 锁定游标行
  3. 一旦我们关闭游标,行是否可以解锁(由 FOR UPDATEFOR UPDATE OF 锁定)?或者我们是否需要 COMMITROLLBACK 事务来解锁行?

  1. 也许这会让你信服......

When we want to update or delete the cursor fetched row(s) from the database, we don’t have to form a UPDATE or a DELETE statement with a primary key mapping in its WHERE clause, instead, the WHERE CURRENT OF clause comes in handy.

来源: http://www.dba-oracle.com/t_adv_plsql_for_update_where_current.htm

  1. 您必须提交或回滚事务才能释放锁。

看看这个街区:

DECLARE

    CURSOR c1 IS
    SELECT course_number, ROWID AS RID
    FROM courses_tbl
    FOR UPDATE;

begin

    FOR aCourse IN c1 LOOP

        UPDATE courses_tbl SET course_number = aCourse.course_number + 1 
        WHERE CURRENT OF c1;
        UPDATE courses_tbl SET course_number = aCourse.course_number + 1 
        WHERE ROWID = aCourse.RID

    end loop;

end;

这两个UPDATE语句是等价的,WHERE CURRENT OF ...只是WHERE ROWID = ...的一个快捷方式,你可以使用其中任何一个。

其实你的问题应该是"Why we need FOR UPDATE ...?"原因是ROWID可能会被其他操作改变,例如ALTER TABLE ... SHRINK SPACE,移动表空间或大 DML。 FOR UPDATE 锁定该行,即确保 ROWID 在您完成交易之前不会更改。

不可以,只有事务结束才能释放锁,即ROLLBACKCOMMIT