Oracle 在PL/SQL中,当前的

Oracle 在PL/SQL中,当前的,oracle,plsql,cursor,Oracle,Plsql,Cursor,为什么我们需要Oracle PL/SQL中的WHERE-CURRENT OF子句?我们都知道FETCH一次只检索一行,因此FETCH在LOOP中用于处理游标的所有行。那么为什么我们只需要一个WHERE CURRENT OF子句呢?我们可以使用进行更新或进行更新来锁定光标行 关闭光标后,行是否可以解锁(更新时由锁定或更新时由锁定)?或者我们是否需要提交或回滚事务以解锁行 也许这会说服你 当我们要更新或删除从 数据库,我们不必使用 其WHERE子句中的主键映射,而不是当前的WHERE 条款很方便 来

为什么我们需要
Oracle PL/SQL
中的
WHERE-CURRENT OF
子句?我们都知道
FETCH
一次只检索一行,因此
FETCH
LOOP
中用于处理游标的所有行。那么为什么我们只需要一个
WHERE CURRENT OF
子句呢?我们可以使用
进行更新
进行更新
来锁定光标行

  • 关闭光标后,行是否可以解锁(更新时由
    锁定或更新时由
    锁定)?或者我们是否需要
    提交
    回滚
    事务以解锁行

  • 也许这会说服你 当我们要更新或删除从 数据库,我们不必使用 其WHERE子句中的主键映射,而不是当前的WHERE 条款很方便

    来源

  • 必须提交或回滚事务才能释放锁
  • 也许这会说服你 当我们要更新或删除从 数据库,我们不必使用 其WHERE子句中的主键映射,而不是当前的WHERE 条款很方便

    来源

  • 必须提交或回滚事务才能释放锁

  • 看看这个街区:

    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语句是等效的,
    其中CURRENT OF…
    只是
    其中ROWID=…
    的快捷方式,您可以使用其中任何一个

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


    不可以,您只能通过完成事务来释放锁,即
    回滚
    提交

    查看此块:

    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语句是等效的,
    其中CURRENT OF…
    只是
    其中ROWID=…
    的快捷方式,您可以使用其中任何一个

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

    不可以,您只能通过完成事务来释放锁,即
    回滚
    提交