Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1211667
  • 博文数量: 398
  • 博客积分: 10110
  • 博客等级: 上将
  • 技术积分: 4055
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 20:01
个人简介

新博客http://www.cnblogs.com/zhjh256 欢迎访问

文章分类

全部博文(398)

文章存档

2012年(1)

2011年(41)

2010年(16)

2009年(98)

2008年(142)

2007年(100)

我的朋友

分类: Oracle

2008-01-06 21:10:44

理论上来说,%NOTFOUND是一个游标属性,并且如果最后一个FETCH语句没有提取到数据则为TRUE,否则为false。而NO_DATA_FOUND是一个预定义的异常,在SELECT ?INTO ?没有提取到纪录时将抛出一个异常。

       两者的区别是,如果FETCH语句没有提取到数据,NO_DATA_FOUND不会抛出异常,换句话说,当使用游标时,NO_DATA_FOUND异常是不会被抛出的,%NOTFOUND会被设置为true。而在SELECT ?INTO ?语句中,NO_DATA_FOUND异常会被抛出,并且%NOTFOUND也会被设置为true

       如下:

SQL> DECLARE l_ename VARCHAR2(100);

BEGIN

  SELECT ename INTO l_ename FROM emp

  WHERE empno = ‘515’;

  DBMS_OUTPUT.PUT_LINE(l_ename);

  EXCEPTION

  WHEN NO_DATA_FOUND THEN

  IF ( SQL%NOTFOUND ) THEN

    DBMS_OUTPUT.PUT_LINE(‘NOTFOUND’);

  ELSE

    DBMS_OUTPUT.PUT_LINE(‘FOUND’);

  END IF;

END;

/

NOTFOUND

 

SQL> DECLARE CURSOR c1 IS SELECT ename FROM emp WHERE empno = 1515;

l_ename VARCHAR2(100);

BEGIN

  OPEN c1;

  LOOP

    FETCH c1 INTO l_ename;

    IF ( c1%NOTFOUND ) THEN

      DBMS_OUTPUT.PUT_LINE(‘NOTFOUND’);

    ELSE

      DBMS_OUTPUT.PUT_LINE(l_ename);

    END IF;

    EXIT WHEN c1%NOTFOUND;

  END LOOP;

  CLOSE c1;

  EXCEPTION

  WHEN NO_DATA_FOUND THEN

  DBMS_OUTPUT.PUT_LINE(‘NO_DATA_FOUND’);

END;

/

NOTFOUND

阅读(1297) | 评论(0) | 转发(0) |
0

上一篇:使用ANYDATA对象

下一篇:DUAL上的等级查询

给主人留下些什么吧!~~