为什么我们需要WHERE CURRENT OF
中的Oracle PL/SQL
条款?我们都知道FETCH
一次只检索一行,因此在FETCH
中使用LOOP
来处理游标的所有行。那为什么我们只需要一个WHERE CURRENT OF
条款?无论如何,我们可以使用FOR UPDATE
或FOR UPDATE OF
锁定光标行。
关闭光标后,行可以解锁(由FOR UPDATE
或FOR UPDATE OF
锁定)吗?或者我们是否需要COMMIT
或ROLLBACK
交易来解锁行?
答案 0 :(得分:2)
看一下这个街区:
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不会更改。
不,您只能通过完成交易来解除锁定,即ROLLBACK
或COMMIT
答案 1 :(得分:0)
当我们想要从中更新或删除游标提取的行时 数据库,我们不必用a形成UPDATE或DELETE语句 WHERE子句中的主键映射,而不是WHERE CURRENT OF 条款派上用场。
<强>来源: http://www.dba-oracle.com/t_adv_plsql_for_update_where_current.htm