代码之家  ›  专栏  ›  技术社区  ›  Subhojyoti Ghosh

其中PL/SQL中的当前

  •  1
  • Subhojyoti Ghosh  · 技术社区  · 8 年前
    1. 为什么我们需要 WHERE CURRENT OF 中的条款 Oracle PL/SQL ?我们都知道这一点 FETCH 一次只检索一行,因此 获取 用于 LOOP 处理光标的所有行。那为什么我们只需要 电流在哪里 条款我们可以使用 FOR UPDATE FOR UPDATE OF

    2. 可以解锁行(通过锁定 用于更新 用于更新 )一旦我们关闭光标?还是我们需要 COMMIT ROLLBACK 要解锁行的事务?

    2 回复  |  直到 8 年前
        1
  •  5
  •   Wernfried Domscheit    8 年前

    请查看此块:

    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 = ... ,您可以使用其中任何一个。

    实际上你的问题应该是“为什么我们需要 FOR UPDATE ... ?“原因是,ROWID可能会因其他操作而更改,例如:。 ALTER TABLE ... SHRINK SPACE ,移动表空间或大型DML。 FOR UPDATE 锁定行,即确保在完成事务之前ROWID不会更改。

    否,您只能通过完成事务来释放锁,即。 ROLLBACK COMMIT

        2
  •  0
  •   PKey    8 年前
    1. 也许这会说服你。。。

    当我们要更新或删除从 数据库,我们不必使用 主键映射在其WHERE子句中,而不是的WHERE CURRENT 条款很方便。

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

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