PL / SQL中的当前状态

时间:2018-03-05 12:40:06

标签: oracle plsql cursor

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

  2. 关闭光标后,行可以解锁(由FOR UPDATEFOR UPDATE OF锁定)吗?或者我们是否需要COMMITROLLBACK交易来解锁行?

2 个答案:

答案 0 :(得分:2)

看一下这个街区:

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不会更改。

不,您只能通过完成交易来解除锁定,即ROLLBACKCOMMIT

答案 1 :(得分:0)

  1. 这可能会说服你......
  2.   

    当我们想要从中更新或删除游标提取的行时   数据库,我们不必用a形成UPDATE或DELETE语句   WHERE子句中的主键映射,而不是WHERE CURRENT OF   条款派上用场。

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

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