oracle 结束游标,关于游标中的LOOP语句什么时候结束循环的问题

1:关于游标中的LOOP语句什么时候结束循环的问题

先看下面一段代码,通常显示游标提取的数据不会只有一条,而是多条记录。这样就需要一个遍历结果集的方式,而LOOP就能实现该功能。下面是实验的代码:

DECLARE

CURSOR pdct_loop_cur

IS

SELECT PRODUCTID, PRODUCTNAME, PRODUCTPRICE FROM PRODUCTINFO

WHERE PRODUCTPRICE > 2500;

cur_productid productinfo.productid%TYPE;

cur_productname productinfo.productname%TYPE;

cur_productprice productinfo.productprice%TYPE;

BEGIN

OPEN pdct_loop_cur;

LOOP

FETCH pdct_loop_cur INTO cur_productid, cur_productname, cur_productprice;

EXIT WHEN pdct_loop_cur%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('产品ID: ' || cur_productid || '产品名称:'

|| cur_productname || '产品价格:' || cur_productprice);

END LOOP;

CLOSE pdct_loop_cur;

END;

/

注意EXIT WHEN pdct_loop_cur%NOTFOUND;它是放在FETCH的下面一行,运行结果如下:

289b7c4aa39d17c0b267708ab6f5bbb1.png

如果把EXIT WHEN pdct_loop_cur%NOTFOUND;放在循环的最后:

DECLARE

CURSOR pdct_loop_cur

IS

SELECT PRODUCTID, PRODUCTNAME, PRODUCTPRICE FROM PRODUCTINFO

WHERE PRODUCTPRICE > 2500;

cur_productid productinfo.productid%TYPE;

cur_productname productinfo.productname%TYPE;

cur_productprice productinfo.productprice%TYPE;

BEGIN

OPEN pdct_loop_cur;

LOOP

FETCH pdct_loop_cur INTO cur_productid, cur_productname, cur_productprice;

DBMS_OUTPUT.PUT_LINE('产品ID: ' || cur_productid || '产品名称:'

|| cur_productname || '产品价格:' || cur_productprice);

EXIT WHEN pdct_loop_cur%NOTFOUND;

END LOOP;

CLOSE pdct_loop_cur;

END;

/

117825a37e0c1880faf09dd411c478a5.png

注意这里最后多输出了一条,而且是跟游标中的最后一条记录是一样。

那如果取消EXIT WHEN pdct_loop_cur%NOTFOUND;呢?

DECLARE

CURSOR pdct_loop_cur

IS

SELECT PRODUCTID, PRODUCTNAME, PRODUCTPRICE FROM PRODUCTINFO

WHERE PRODUCTPRICE > 2500;

cur_productid productinfo.productid%TYPE;

cur_productname productinfo.productname%TYPE;

cur_productprice productinfo.productprice%TYPE;

BEGIN

OPEN pdct_loop_cur;

LOOP

FETCH pdct_loop_cur INTO cur_productid, cur_productname, cur_productprice;

--EXIT WHEN pdct_loop_cur%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('产品ID: ' || cur_productid || '产品名称:'

|| cur_productname || '产品价格:' || cur_productprice);

END LOOP;

CLOSE pdct_loop_cur;

END;

/

如图:

1e1face2fdb91052ae256e165831ab1e.png

这里会无限循环,但是最后输出的都是游标中的最后一条记录。由此是否可以这样推测(自己的推测):

游标的指针初始时它指向首记录,而后每次循环向后移一个位置,并且如果最后是没有记录的,即WHEN pdct_loop_cur%NOTFOUND时会发出已经到了记录末尾的信息,不过这时指针指向的还是有效记录的最后一个位置。这样就可以解释为什么去掉了EXIT WHEN pdct_loop_cur%NOTFOUND;之后,输出的是连续的最后一个记录的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值