PL / SQL中的当前状态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PL / SQL中的当前状态相关的知识,希望对你有一定的参考价值。

  1. 为什么我们需要WHERE CURRENT OF中的Oracle PL/SQL条款?我们都知道FETCH一次只检索一行,因此在FETCH中使用LOOP来处理游标的所有行。那为什么我们只需要一个WHERE CURRENT OF条款?无论如何,我们可以使用FOR UPDATEFOR UPDATE OF锁定光标行。
  2. 一旦我们关闭光标,行可以解锁(由FOR UPDATEFOR UPDATE OF锁定)吗?或者我们需要COMMITROLLBACK交易解锁行?
答案

看看这个块:

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. 可能这会说服你......

当我们想要从数据库更新或删除游标提取的行时,我们不必在其WHERE子句中形成带有主键映射的UPDATE或DELETE语句,而是WHERE CURRENT OF子句进入便利。

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

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

以上是关于PL / SQL中的当前状态的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL数据库开发那点事

PL/SQL - 你可以通过索引访问游标中的某些记录吗?

PL-SQL:ORA-00904 - 标识符无效 - Select and Pivot 子句中的列

PL/SQL 中的验证检查

SQL记录-PLSQL包

PL/SQL包(package)操作实例讲解