declare num number; 
begin 
update emp set empno=123 where empno=111;
if sql%rowcount=0 then 
  dbms_output.put_line('不存在记录'); 
else 
  dbms_output.put_line('存在记录'); 
end if; 
end;
如上面的代码来自网上的教程,update其实是成功了的,更新了一行记录。
但是我调试的时候发现,实际上sql%rowcount 根本就是没有值的,这里说的没有值不是指值等与NULL;
我判断 sql%isopen 发现他也是没有值的   ……  
请高手指点一下,我是不是把隐式游标理解错了??

解决方案 »

  1.   

    eygle@SZTYORA> select * from emp;     EMPNO ENAME                JOB                       MGR HIREDATE                   SAL       COMM     DEPTNO LOC
    ---------- -------------------- ------------------ ---------- ------------------- ---------- ---------- ---------- --------------------------
          8888 luoyoumou            MANAGER                  7499 2011-04-01 17:57:43       4000        400         30 BEIJING
          7499 ALLEN                SALESMAN                 7698 1981-02-20 00:00:00       1600        300         30 CHICAGO
          7521 WARD                 SALESMAN                 7698 1981-02-22 00:00:00       1250        500         30 CHICAGO
          7654 MARTIN               SALESMAN                 7698 1981-09-28 00:00:00       1250        400         30 CHICAGO
          7844 TURNER               SALESMAN                 7698 1981-09-08 00:00:00       1500          0         30 CHICAGO
          7900 JAMES                CLERK                    7698 1981-12-03 00:00:00        950            30 CHICAGO
          7369 SMITH                CLERK                    7902 1980-12-17 00:00:00        800            20 DALLAS已选择7行。eygle@SZTYORA> declare num number;
      2  begin
      3  update emp set empno=123 where empno=8888;
      4  if sql%rowcount=0 then
      5    dbms_output.put_line('不存在记录');
      6  else
      7    dbms_output.put_line('存在记录');
      8  end if;
      9  end;
     10  /
    存在记录PL/SQL 过程已成功完成。eygle@SZTYORA> select * from emp;     EMPNO ENAME                JOB                       MGR HIREDATE                   SAL       COMM     DEPTNO LOC
    ---------- -------------------- ------------------ ---------- ------------------- ---------- ---------- ---------- --------------------------
           123 luoyoumou            MANAGER                  7499 2011-04-01 17:57:43       4000        400         30 BEIJING
          7499 ALLEN                SALESMAN                 7698 1981-02-20 00:00:00       1600        300         30 CHICAGO
          7521 WARD                 SALESMAN                 7698 1981-02-22 00:00:00       1250        500         30 CHICAGO
          7654 MARTIN               SALESMAN                 7698 1981-09-28 00:00:00       1250        400         30 CHICAGO
          7844 TURNER               SALESMAN                 7698 1981-09-08 00:00:00       1500          0         30 CHICAGO
          7900 JAMES                CLERK                    7698 1981-12-03 00:00:00        950            30 CHICAGO
          7369 SMITH                CLERK                    7902 1980-12-17 00:00:00        800            20 DALLAS已选择7行。
      

  2.   

    to lzd_83:
        为什么没有值呢?to luoyoumou:
        我的执行情况跟你一样。猛的一看,好像确实没有问题。
        但是细看一下if判断条件。当 sql%rowcount 不等于0 时,输出:存在记录。
        此时sql%rowcount 是没有值的,必然走进这个分支中。
        你可以尝试调试,或者把 sql%rowcount 的值输出来,就会发现他是没有值的。
        
      

  3.   

    -- 怎么会呢?
    eygle@SZTYORA> select * from emp;     EMPNO ENAME                JOB                       MGR HIREDATE                   SAL       COMM     DEPTNO LOC
    ---------- -------------------- ------------------ ---------- ------------------- ---------- ---------- ---------- ------------------------
           123 luoyoumou            MANAGER                  7499 2011-04-01 17:57:43       4000        400         30 BEIJING
          7499 ALLEN                SALESMAN                 7698 1981-02-20 00:00:00       1600        300         30 CHICAGO
          7521 WARD                 SALESMAN                 7698 1981-02-22 00:00:00       1250        500         30 CHICAGO
          7654 MARTIN               SALESMAN                 7698 1981-09-28 00:00:00       1250        400         30 CHICAGO
          7844 TURNER               SALESMAN                 7698 1981-09-08 00:00:00       1500          0         30 CHICAGO
          7900 JAMES                CLERK                    7698 1981-12-03 00:00:00        950            30 CHICAGO
          7369 SMITH                CLERK                    7902 1980-12-17 00:00:00        800            20 DALLAS已选择7行。eygle@SZTYORA> declare num number;
      2  begin
      3  update emp set empno=123 where empno=8889;
      4  if sql%rowcount=0 then
      5    dbms_output.put_line('不存在记录');
      6    dbms_output.put_line(to_char(sql%rowcount));
      7  else
      8    dbms_output.put_line('存在记录');
      9    dbms_output.put_line(to_char(sql%rowcount));
     10  end if;
     11  end;
     12  /
    不存在记录
    0PL/SQL 过程已成功完成。eygle@SZTYORA> declare num number;
      2  begin
      3  update emp set empno=111 where empno=123;
      4  if sql%rowcount=0 then
      5    dbms_output.put_line('不存在记录');
      6    dbms_output.put_line(to_char(sql%rowcount));
      7  else
      8    dbms_output.put_line('存在记录');
      9    dbms_output.put_line(to_char(sql%rowcount));
     10  end if;
     11  end;
     12  /
    存在记录
    1PL/SQL 过程已成功完成。
      

  4.   


    刚测试了一下,你说的没有错确实能得到sql%rowcount 的结果。      if SQL%ROWCOUNT=0 THEN
            ret_code:=0;
          elsif SQL%ROWCOUNT=1 then
            ret_code:=1;
          else 
            ret_code:=SQL%ROWCOUNT;
          end if;我测试了update可以,但是把update语句换成select * from emp 得不到 sql%rowcount 的结果。
      

  5.   

    我这里用的是 PL/SQl DEvelpoment ,用里面的test功能,调试的时候是看不到隐式指针的属性值的。
      

  6.   


    declare num number; 
    begin 
    select count(*) into num from emp where empno=7999;
    if sql%rowcount=0 then 
      dbms_output.put_line('不存在记录'); 
      dbms_output.put_line(to_char(sql%rowcount));
    else 
      dbms_output.put_line('存在记录');
      dbms_output.put_line(to_char(sql%rowcount)); 
    end if; 
    end;
    /-- 因为上面查询:哪怕表中没有符合条件的记录也会返回类似如下的结果: 
    scott@SZTYORA> select count(*) from emp where empno=7999;  COUNT(*)
    ----------
             0已选择 1 行。
             
    -- 上面也是1条记录,所以:sql%rowcount当然就为1啦!
      

  7.   

    select count(*) into num from emp where empno=7999;
    上面的因为使用了 into 所以如果必须加上 count,要不当返回多行的时候数据库会报错。
    所以要使用 select * from emp, 让数据库返回多行数据,这时候 sql%rowcount 的总是为 0