PL/SQL "WHERE CURRENT OF" vs "ROWID"



当可以使用"rowid"时,为什么Oracle会制作"where current of"语法?例:

BEGIN
  FOR rec IN (SELECT t.column1, t.rowid rid FROM test_table) LOOP
    UPDATE test_table tb SET column1 = some_function(rec.column1) WHERE tb.rowid = rec.rid;
  END LOOP;
  COMMIT;
END;
DECLARE 
  CURSOR cur IS SELECT t.column1 FROM test_table;
  param1 test_table.column1%TYPE;
BEGIN
  LOOP
    FETCH cur INTO param1;
    UPDATE test_table tb SET tb.column1 = some_function(param1) WHERE CURRENT OF cur;
    EXIT WHEN cur%NOTFOUND;
  END LOOP;
  COMMIT;
END;
Where Current Of用于

标识游标中的上次获取行。它更安全,因为你有100%的信心,也就是说。您从curosr更新上次获取的行。对于Rowids来说,有危险,因为很容易搞砸一些东西。

使用

WHERE CURRENT OF 子句而不使用 SELECT 语句中提到的 FOR UPDATE 子句可能会有风险。这背后的原因是,当您不应用 FOR UPDATE 子句时,您并没有专门将行级锁定放置在您打算在以下更新 DML 中更新的那些行上。因此,它为违反数据一致性的外部世界提供了机会,即来自不同会话的其他用户可能希望更新目标表的相同行。此外,在了解有关 WHERE CURRENT OF 子句的更多信息中,您会注意到,在此子句期间,Oracle 内部仅使用 ROWID 来访问/识别需要更新的行。希望有帮助!!快乐编程

相关内容

  • 没有找到相关文章