PL / SQL“WHERE CURRENT OF”vs“ROWID”

时间:2016-04-25 07:26:44

标签: oracle plsql rowid

为什么Oracle在使用“rowid”时会产生“当前的”语法?例如:

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;

2 个答案:

答案 0 :(得分:0)

Where Current Of用于标识游标中的LAST FETCHED ROW。它更安全,因为你有100%的信心,即f.e。您从curosr更新LAST FETCHED ROW。使用Rowids存在危险,因为它很容易搞砸了。

答案 1 :(得分:0)

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