PL/SQL 中的当前位置
WHERE CURRENT OF in PL/SQL
为什么我们需要 Oracle PL/SQL
中的 WHERE CURRENT OF
子句?我们都知道 FETCH
一次只检索一行,因此 FETCH
在 LOOP
中用于处理游标的所有行。那为什么我们只需要一个 WHERE CURRENT OF
子句呢?我们无论如何都可以使用 FOR UPDATE
或 FOR UPDATE OF
.
锁定游标行
一旦我们关闭游标,行是否可以解锁(由 FOR UPDATE
或 FOR UPDATE OF
锁定)?或者我们是否需要 COMMIT
或 ROLLBACK
事务来解锁行?
- 也许这会让你信服......
When we want to update or delete the cursor fetched row(s) from the
database, we don’t have to form a UPDATE or a DELETE statement with a
primary key mapping in its WHERE clause, instead, the WHERE CURRENT OF
clause comes in handy.
来源:
http://www.dba-oracle.com/t_adv_plsql_for_update_where_current.htm
- 您必须提交或回滚事务才能释放锁。
看看这个街区:
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 = ...
的一个快捷方式,你可以使用其中任何一个。
其实你的问题应该是"Why we need FOR UPDATE ...
?"原因是ROWID可能会被其他操作改变,例如ALTER TABLE ... SHRINK SPACE
,移动表空间或大 DML。 FOR UPDATE
锁定该行,即确保 ROWID 在您完成交易之前不会更改。
不可以,只有事务结束才能释放锁,即ROLLBACK
或COMMIT
为什么我们需要
Oracle PL/SQL
中的WHERE CURRENT OF
子句?我们都知道FETCH
一次只检索一行,因此FETCH
在LOOP
中用于处理游标的所有行。那为什么我们只需要一个WHERE CURRENT OF
子句呢?我们无论如何都可以使用FOR UPDATE
或FOR UPDATE OF
. 锁定游标行
一旦我们关闭游标,行是否可以解锁(由
FOR UPDATE
或FOR UPDATE OF
锁定)?或者我们是否需要COMMIT
或ROLLBACK
事务来解锁行?
- 也许这会让你信服......
When we want to update or delete the cursor fetched row(s) from the database, we don’t have to form a UPDATE or a DELETE statement with a primary key mapping in its WHERE clause, instead, the WHERE CURRENT OF clause comes in handy.
来源: http://www.dba-oracle.com/t_adv_plsql_for_update_where_current.htm
- 您必须提交或回滚事务才能释放锁。
看看这个街区:
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 = ...
的一个快捷方式,你可以使用其中任何一个。
其实你的问题应该是"Why we need FOR UPDATE ...
?"原因是ROWID可能会被其他操作改变,例如ALTER TABLE ... SHRINK SPACE
,移动表空间或大 DML。 FOR UPDATE
锁定该行,即确保 ROWID 在您完成交易之前不会更改。
不可以,只有事务结束才能释放锁,即ROLLBACK
或COMMIT