NB:我刚才重读你的问题..你要失败的。如果只有1个记录.. 我会后在某一时刻有新的更新..
,让我们开始在这里..
从的Oracle®数据库PL/SQL用户指南和参考 10g第2版(10.2) 型号B14261-01 reference
所有行在你打开游标时重新锁定,而不是在取出游标时锁定。当您提交或回滚事务时,这些行将被解锁。由于行不再被锁定,所以在提交后无法从FOR UPDATE游标读取。
所以你不需要担心记录解锁。
所以试试这个..
declare
CURSOR mytable_cur IS SELECT * FROM MY_TABLE WHERE SALARY < 50000 FOR UPDATE;
TYPE mytable_tt IS TABLE OF mytable_cur %ROWTYPE
INDEX BY PLS_INTEGER;
l_my_table_recs mytable_tt;
l_totalcount NUMBER;
begin
OPEN mytable_cur ;
l_totalcount := 0;
LOOP
FETCH mytable_cur
BULK COLLECT INTO l_my_table_recs LIMIT 100;
l_totalcount := l_totalcount + NVL(l_my_table_recs.COUNT,0);
--this is the check for only 1 row..
EXIT WHEN l_totalcount < 2;
FOR indx IN 1 .. l_my_table_recs.COUNT
LOOP
--process each record.. via l_my_table_recs (indx)
END LOOP;
EXIT WHEN mytable_cur%NOTFOUND;
END LOOP;
CLOSE mytable_cur ;
end;
ALTERNATE ANSWER 我看了你的答案向后启动,以为你想退出,如果有更多的则1排..不是正好有一个。所以这是我以前的答案。
2个简单的方法来检查只有1条记录。
选项1 - 显式去抓取
declare
CURSOR C1 IS SELECT * FROM MY_TABLE WHERE SALARY < 50000 FOR UPDATE;
l_my_table_rec C1%rowtype;
l_my_table_rec2 C1%rowtype;
begin
open C1;
fetch c1 into l_my_table_rec;
if c1%NOTFOUND then
--no data found
end if;
fetch c1 into l_my_table_rec2;
if c1%FOUND THEN
--i have more then 1 row
end if;
close c1;
-- processing logic
end;
我希望你的想法。
选择2 - 异常捕获
declare
CURSOR C1 IS SELECT * FROM MY_TABLE WHERE SALARY < 50000 FOR UPDATE;
l_my_table_rec C1%rowtype;
begin
begin
select *
from my_table
into l_my_table_rec
where salary < 50000
for update;
exception
when too_many_rows then
-- handle the exception where more than one row is returned
when no_data_found then
-- handle the exception where no rows are returned
when others then raise;
end;
-- processing logic
end;
此外 记住:用显式游标..你可以%键入您的变量关闭光标记录而不是原始表。
当您在查询中加入时,这特别有用。
此外,rememebr您可以用
UPDATE table_name
SET set_clause
WHERE CURRENT OF cursor_name;
类型语句更新表中的行,但我认为如果你还没有“获取”第二行只会工作..
有关游标FOR循环一些更多的信息..尝试 Here