oracle数据库%notfound的理解

15人阅读 评论(0) 收藏 举报
分类:

文档中的解释:

It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO statement returned no rows.Otherwise, it returns FALSE.

这个解释更加精妙:

%NOTFOUND is the logical opposite of %FOUND. %NOTFOUND yields FALSE if the last fetch returned a row, or TRUE if the last fetch failed to return a row

错误的例子:

tableA
id  name
1   a
2   b
 DECLARE
    CURSOR v_cur IS
      SELECT name
      FROM   tablea;
    n VARCHAR2(10);
BEGIN
    OPEN v_cur;

    LOOP
        EXIT WHEN v_cur%NOTFOUND;

        FETCH v_cur INTO n;

        dbms_output.Put_line(n);

        CLOSE v_cur;
    END LOOP;
END;  

执行上面的语句,结果为:

a
b
b

发现最后一条记录被打印了两次。原因是%notfound是判断最后一次fetch的结果,把b fetch到变量n中之后再执行exit when %notfound判断得到的是false的记过,也就是说是有返回行的,所以判断通过,再此执行了打印语句。
发现了另一个疑问:
a,bfetch之后按理说游标已经空了,那么第三次应该是fetch的空值,为什么打印出来的还是b呢??
因为fetch..into语句末尾不会修改into变量后面的值。就像select..into如果没有数据会报异常,但是不会把into后面的变量置为空
再写一段代码

 DECLARE
  CURSOR v_cur IS
    SELECT name
    FROM   tablea
    WHERE  name = 'c';

n VARCHAR2(10);
BEGIN
  OPEN v_cur;
  LOOP
    EXIT
  WHEN v_cur%NOTFOUND;
    n:='hehe'
    FETCH v_cur
    INTO  n;

    dbms_output.Put_line(n);
    CLOSE v_cur;
  END LOOP;
END; 

执行代码的结果:
hehe
疑问:游标是空游标,也就是说游标在打开的时候就没有指向任何的值。但为什么exit when v_cur%notfound;这条语句还通过了呢??

oracle文档的解释:

Before the first fetch, %NOTFOUND returns NULL. If FETCH never executes successfully, the loop is never exited, because the EXIT WHEN statement executes only if its WHEN condition is true. To be safe, you might want to use the following EXIT statement instead:

EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;

也就是说v_cur%notfound有三种状态,true,false,null。所以以后为了安全期间可以加上是否为空的判断


oracle数据库中sql%notfound的用法详解

SQL%NOTFOUND 是一个布尔值。与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true。否则返回false。这样的语句在实际应用中,是非常有用的。例如要update一行数据时,如果没有找到,就可以作相应操作。如:

begin
 update table_name set salary = 10000 where emp_id = 10;
 if sql%notfound then
  insert into table_name (id,name,salary)values("","","") ;
 end if;
end;

update emp_id10的这行记录,如果update影响条数为0,则插入一条数据。

SQL%FOUND 的用法与sql%notfound用法相反,也是与最近的sql语句发生交互,如果影响行数大于0条,则为true,否则为false

SQL%ROWCOUNTdml语句执行前是null,执行后,对于select into语句,执行成功则值为1,不成功则值为0


cursor%NOTFOUND
表示这个游标没有查到数据

–%FOUND – SQL语句影响了一行或多行时为 TRUE

–%NOTFOUND – SQL语句没有影响任何行时为TRUE

–%ROWCOUNT – SQL语句影响的行数

–%ISOPEN - 游标是否打开,始终为FALSE

查看评论

深入理解远程调用之Hessian

本技术分享视频主要从3个方面来介绍hessian。(1)hessian入门应用实现(2)源码角度分析hessian基本的原理(3)深入源码解析hessian的序列化和反序列化机制
  • 2017年06月24日 20:03

%notfound的理解

%notfound的理解——oracle存储过程 . 文档中的解释:It returns TRUE if an INSERT, UPDATE, or DELETE statement affecte...
  • lpx982083543
  • lpx982083543
  • 2017-11-09 09:54:18
  • 63

Oracle数据库概念理解

 Oracle数据库服务器      Oracle Server是一个对象—关系数据库管理系统,它提供开放的,集成的,全面的信息管理方法。每一个Server由一个Oracle DB和一个Oracle ...
  • tianzengyan
  • tianzengyan
  • 2010-03-31 12:19:00
  • 2547

Oracle的概念理解

1.了解一些关于数据库的概念 2.了解oracle背景 3.oracle数据库服务器的组成 4.oracle数据库服务器与orcl数据库的关系 5.如何在oracle数据库服务器中创建多个数据...
  • miss_yingHao
  • miss_yingHao
  • 2017-11-23 13:15:25
  • 191

oracle数据库概念理解

数据库: Oracle数据库是数据的物理存储。这就包括(数据文件ORA或者DBF、控制文件、联机日志、参数文件)。其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库...
  • strivenoend
  • strivenoend
  • 2017-11-11 19:46:15
  • 83

%notfound的理解——oracle存储过程

文档中的解释:It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INT...
  • muqiong88
  • muqiong88
  • 2014-05-29 10:16:05
  • 380

数据库 范式 概念 和 理解

构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF...
  • ABC006250
  • ABC006250
  • 2012-07-26 15:34:59
  • 312

自己理解的oracle的概念

1.一台oracle系统可以创建多个数据库,比如jessora和orcl 2.每个数据库由表空间支撑,一个数据库可以而且通常有多个表空间(如缺省的system/users/temp,自己创建的nms...
  • dyzhen
  • dyzhen
  • 2015-05-02 11:50:02
  • 284

深入理解Oracle数据库group by语句

Group by的语法 Select [filed1,fild2,]聚合函数(filed), [Grouping(filed),] [Grouping_id(filed1,filed2,…)] Fro...
  • qq_30408111
  • qq_30408111
  • 2016-06-06 21:38:45
  • 258

%NOTFOUND 用法

文档中的解释:It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO ...
  • wacthamu
  • wacthamu
  • 2012-10-30 11:42:25
  • 1641
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 147万+
    积分: 2万+
    排名: 485
    博客专栏
    文章分类
    微信公众号