隐式游标使用notfound为什么不抛出异常?

softzhongshi 2011-04-07 05:26:34
我有个问题,Oracle上说,如果游标被关闭,那么使用%NOTFOUND属性时就会抛出异常,而SQL作为隐式游标,总是关闭的,那么SQL使用%NOTFOUND时为什么不抛出异常呢?
就像下面的代码:
[code=SQL]DECLARE
TYPE tmp IS TABLE OF hs_user.users%ROWTYPE;
tmpdata tmp;
v_cursor hstype.t_cursor;
BEGIN
OPEN v_cursor FOR SELECT * FROM hs_user.users WHERE ROWNUM<5;
CLOSE v_cursor;
IF v_cursor%NOTFOUND
THEN
DBMS_OUTPUT.put_line('t_curosr not found');
ELSE
DBMS_OUTPUT.put_line('found');
END IF;
SELECT a.* BULK COLLECT INTO tmpdata FROM hs_user.users a WHERE ROWNUM<6;
IF SQL%NOTFOUND
THEN
DBMS_OUTPUT.put_line('abccccc');
ELSE
DBMS_OUTPUT.put_line('else');
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('exception');
END;[/code
输出结果是exception
但是注释掉CLOSE则不会抛出异常了,为什么?
...全文
134 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixinbill 2011-04-08
  • 打赏
  • 举报
回复

DECLARE
TYPE tmp IS TABLE OF hs_user.users%ROWTYPE;
tmpdata tmp;
v_cursor hstype.t_cursor;
BEGIN
OPEN v_cursor FOR SELECT * FROM hs_user.users WHERE ROWNUM<5;
CLOSE v_cursor;
IF v_cursor%NOTFOUND
THEN
DBMS_OUTPUT.put_line('t_curosr not found');
ELSE
DBMS_OUTPUT.put_line('found');
END IF;
SELECT a.* BULK COLLECT INTO tmpdata FROM hs_user.users a WHERE ROWNUM<6;
IF SQL%NOTFOUND
THEN
DBMS_OUTPUT.put_line('abccccc');
ELSE
DBMS_OUTPUT.put_line('else');
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('exception');

--CLOSE v_cursor; 应该放这里


END;



你还没用游标呢 你就给close了 能不异常么 应当放到最后close
坚强活着 2011-04-07
  • 打赏
  • 举报
回复
附加一句,sql作为隐式游标是指写select into 或是update,insert语句的这种,就是不用open cursor的写法。
坚强活着 2011-04-07
  • 打赏
  • 举报
回复
游标关闭了,当然会抛cursor is not open的异常啊,游标是打开的,就可以正常访问%notfound呀。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧