oracle存储过程遍历游标问题

代码如下emp表里就一条数据createorreplaceprocedureTestCur3iscursorcurisselectename,job,salfrommye... 代码如下 emp表里 就一条数据
create or replace procedure TestCur3 is
cursor cur is select ename,job,sal from myemp;
pname myemp.ename%type;
pjob myemp.job%type;
psal myemp.sal%type;
begin
open cur;
loop
exit when cur%notfound;
fetch cur into pname,pjob,psal;
dbms_output.put_line(pname||'的工作是'||pjob||',薪水是'||psal);
end loop;
close cur;
end TestCur3;
这样遍历出来的 结果 是2条 为什么?
create or replace procedure TestCur3 is
cursor cur is select ename,job,sal from myemp;
pname myemp.ename%type;
pjob myemp.job%type;
psal myemp.sal%type;
begin
open cur;
loop
fetch cur into pname,pjob,psal;
exit when cur%notfound;
dbms_output.put_line(pname||'的工作是'||pjob||',薪水是'||psal);
end loop;
close cur;
end TestCur3;
这样遍历 结果是1条记录 为什么 先fetch在判断 就是一条结果 先判断在fetch就是2条结果,新手请高手详细说明 谢谢
展开
 我来答
micro0369
2013-07-12 · TA获得超过1.2万个赞
知道大有可为答主
回答量:9250
采纳率:85%
帮助的人:4088万
展开全部
第二段代码是对的,

第一段代码是错的,你有没有发现,你第一段代码 的两条,后一条 应该是空值

还没有 fetch ,不应该判断 cur%notfound;
在fetch后,才应该判断 cur%notfound;

看看你的第一段代码:
open cur;
loop
exit when cur%notfound;
fetch cur into pname,pjob,psal;
dbms_output.put_line(pname||'的工作是'||pjob||',薪水是'||psal);
end loop;
close cur;

-- 第一轮循环, fetch到值, 进行输出
-- 第二轮循环,判断第一轮循环是否取到值; 然后fetch, 此时如果没有值, 你仍然进行输出
-- 第三轮循环,判断第二轮循环是否取到值,没有值,退出

其实你只要一行值符合要求
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
heshengxi10
2013-07-12
知道答主
回答量:46
采纳率:0%
帮助的人:21.6万
展开全部
提取游标的一条数据,游标对的索引会向后移一位。没有提取的话,初始值其实不是在游标的第一个索引位,而是起始位(介于打开第一个索引位,就绪状态),当提取时游标才指向第一个索引位,提取后移动下一个索引位。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友884aad6
2013-07-12 · 超过12用户采纳过TA的回答
知道答主
回答量:39
采纳率:0%
帮助的人:32.8万
展开全部
notfound 是针对是否 fetch 到结果而言 并非对游标的指向
http://blog.csdn.net/fznf1010/article/details/7973041
你看看这个 说的很详细
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式