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
感谢全面的答案。我希望有可能是一个更简单的方式来获得的光标记录的计数而不实际获取的所有数据,但我更喜欢这种解决方案在出台保存点。将一堆记录读入我没有用的变量中感觉很笨拙(这实际上只是一个锁,我需要知道我锁定了多少记录)。我的使用案例是我需要删除一个记录,但必须总是剩下一个;在我确认2存在于我的光标后,我发出一个单独的删除来查明我想删除的特定记录。 – 2010-02-19 14:36:38
好吧..也许你应该尝试反向..和只是一个直上“重复”的行删除。如果他们不存在..然后什么也没有发生。如果他们这样做,你留下1? ..即DELETE FROM my_table WHERE(这里只选择重复的行); – ShoeLace 2010-02-22 22:54:18