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 发现他也是没有值的 ……
请高手指点一下,我是不是把隐式游标理解错了??
解决方案 »
- 如何计算weblogic的heap内存大小(xmx,xms)?
- Trigger created with compilation errors.求大侠
- Oracle 数据库控制台进不去
- 大家还用oracle jdeveloper 10g 开发程序吗
- 关于SEQUNCE的访问
- 问题很简单,谢谢回帖
- 急啊!!新手误删了oracle数据库里面的数据,数据都不见了,怎么才能恢复呀??
- @@@急!oracle安装之后,输入密码进不去,凭证检索失败!在线等!
- Oracle 日期函数操作一问
- 我用dbms_lob.fileopen为什么总说对不存在的目录或文件进行FILEOPEN操作
- 请问在unix主机上如何用脚本获取sqlldr的执行状态,即成功或失败。
- ORA-00972 identifier is too long
---------- -------------------- ------------------ ---------- ------------------- ---------- ---------- ---------- --------------------------
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行。
为什么没有值呢?to luoyoumou:
我的执行情况跟你一样。猛的一看,好像确实没有问题。
但是细看一下if判断条件。当 sql%rowcount 不等于0 时,输出:存在记录。
此时sql%rowcount 是没有值的,必然走进这个分支中。
你可以尝试调试,或者把 sql%rowcount 的值输出来,就会发现他是没有值的。
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 过程已成功完成。
刚测试了一下,你说的没有错确实能得到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 的结果。
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啦!
上面的因为使用了 into 所以如果必须加上 count,要不当返回多行的时候数据库会报错。
所以要使用 select * from emp, 让数据库返回多行数据,这时候 sql%rowcount 的总是为 0