PL/SQL "WHERE CURRENT OF" 对比 "ROWID"

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

为什么 Oracle 在可以使用 "rowid" 的情况下使用 "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 用于标识游标中的 LAST FETCHED ROW。它更安全,因为您有 100% 的信心 f.e。您从 curosr 更新了 LAST FETCHED ROW。使用 Rowids 是有危险的,因为很容易搞砸。

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