当可以使用"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 来访问/识别需要更新的行。希望有帮助!!快乐编程