oracle 隐式游标的用法

wangpeng_118 2011-04-02 03:04:59
 
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 发现他也是没有值的 ……
请高手指点一下,我是不是把隐式游标理解错了??
...全文
302 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangpeng_118 2011-04-02
  • 打赏
  • 举报
回复
select count(*) into num from emp where empno=7999;
上面的因为使用了 into 所以如果必须加上 count,要不当返回多行的时候数据库会报错。


所以要使用 select * from emp, 让数据库返回多行数据,这时候 sql%rowcount 的总是为 0
luoyoumou 2011-04-02
  • 打赏
  • 举报
回复

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啦!
wangpeng_118 2011-04-02
  • 打赏
  • 举报
回复
我这里用的是 PL/SQl DEvelpoment ,用里面的test功能,调试的时候是看不到隐式指针的属性值的。
wangpeng_118 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luoyoumou 的回复:]
SQL code
-- 怎么会呢?
eygle@SZTYORA> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO LOC
---------- ------------……
[/Quote]

刚测试了一下,你说的没有错确实能得到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 的结果。
luoyoumou 2011-04-02
  • 打赏
  • 举报
回复
-- 怎么会呢?
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 /
不存在记录
0

PL/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 /
存在记录
1

PL/SQL 过程已成功完成。
wangpeng_118 2011-04-02
  • 打赏
  • 举报
回复
to lzd_83:
为什么没有值呢?

to luoyoumou:
我的执行情况跟你一样。猛的一看,好像确实没有问题。
但是细看一下if判断条件。当 sql%rowcount 不等于0 时,输出:存在记录。
此时sql%rowcount 是没有值的,必然走进这个分支中。
你可以尝试调试,或者把 sql%rowcount 的值输出来,就会发现他是没有值的。
luoyoumou 2011-04-02
  • 打赏
  • 举报
回复
-- 我测试了一下,你的代码是可以的!
luoyoumou 2011-04-02
  • 打赏
  • 举报
回复
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行。
Rotel-刘志东 2011-04-02
  • 打赏
  • 举报
回复
不是理解错错误,而是就是取不到值。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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