ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle开发 » plsql中的返回值的区别

标题: plsql中的返回值的区别
离线 lxch257
中级会员



精华贴数 0
个人空间 0
技术积分 846 (2269)
社区积分 63 (4421)
注册日期 2001-11-18
论坛徽章:1
授权会员     
      

发表于 2002-1-9 16:17 
plsql中的返回值的区别

DECLARE
v_count PLS_INTEGER;
v_rowcount PLS_INTEGER;
BEGIN
SELECT COUNT(*) INTO v_count FROM emp
       WHERE sal > 3000;
v_rowcount := SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE ('Total rows from table : ' ||v_count);
DBMS_OUTPUT.PUT_LINE ('%ROWCOUNT value from SELECT: ' ||v_rowcount);
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE ('Records Found For Update');

  UPDATE emp SET sal = sal * 1.10 WHERE sal > 3000;
  v_rowcount := SQL%ROWCOUNT;
  DBMS_OUTPUT.PUT_LINE ('SQL%ROWCOUNT value after update: ' || v_rowcount);
  IF SQL%NOTFOUND THEN
    DBMS_OUTPUT.PUT_LINE ('No rows updated');
  END IF;
END IF;
commit;
END;
************
对于v_rowcount 的记录为什么与count(*)不一样

望大虾们多多指点


__________________
不因事小而不为,点滴积累,终有所获
顶部
离线 eric
中级会员


精华贴数 0
个人空间 0
技术积分 457 (4323)
社区积分 288 (1985)
注册日期 2001-10-17
论坛徽章:1
      
      

发表于 2002-1-9 19:29 
count(*) means the record number in a table, include null value,
sql%rowcount means the record number the sql statement just effect.


__________________
-----------------------------------------------------不是我不明白,这世界变化快。
顶部
离线 lxch257
中级会员



精华贴数 0
个人空间 0
技术积分 846 (2269)
社区积分 63 (4421)
注册日期 2001-11-18
论坛徽章:1
授权会员     
      

发表于 2002-1-10 11:04 
是不是sql%只对DML(update,insert,delete)起作用,
对select没有用,在sql%rowcount中select后的返回值默认为1?


__________________
不因事小而不为,点滴积累,终有所获
顶部
离线 蓝带鱼
中级会员


精华贴数 0
个人空间 0
技术积分 608 (3192)
社区积分 407 (1631)
注册日期 2001-11-9
论坛徽章:3
ITPUB元老会员2006贡献徽章授权会员   
      

发表于 2002-1-10 12:33 
不是没用
你用的select 语句包含了into子句,所以属于隐式游标
是单行的select语句
%rowcount 返回的是到目前为止由游标返回行的数目
所以它返回的值是1


__________________
横批:全面发展左脑负责发帖右脑负责灌水bluebluefish@itpub.net
顶部
离线 流云飞天
孤影萍踪



精华贴数 0
个人空间 0
技术积分 186 (10122)
社区积分 0 (51176)
注册日期 2002-1-10
论坛徽章:0
      
      

发表于 2002-1-10 12:34 
我对v_count 和 v_rowcount 的理解……

在语句
SELECT COUNT(*) INTO v_count FROM emp  WHERE sal > 3000;
中,假设表中有10条记录符合要求,所以 v_count = 10。

但是,接下来的语句
v_rowcount := SQL%ROWCOUNT;
是指上面的 SELECT 语句执行成功后,返给你的记录条数,当然为里只返回一条记录。如果在SQLPLUS 下运行的话,结果会是:
COUNT(*)
----------------
            10
所以 v_rowcount = 1。

对于语句:
UPDATE emp SET sal = sal * 1.10 WHERE sal > 3000;
执行成功后,
v_rowcount := SQL%ROWCOUNT;
则 v_rowcount 会等于10,就如 eric 所说,它影响了10条记录。

不知我的解释,对您是否有所帮助。:)


__________________
忧郁的眼睛真诚的心,相识相知愿与君。redsun_shine@sina.com路漫漫,吾上下而求索之修者,远兮!小的时候,不知道理想是什么;长大以后,又不知什么是理想……
顶部
离线 wireman
一般会员



精华贴数 0
个人空间 0
技术积分 198 (9600)
社区积分 19 (7834)
注册日期 2001-9-24
论坛徽章:0
      
      

发表于 2002-1-10 12:37 
這並沒有什麽差異阿

SELECT COUNT(*)確實是只有一條記錄阿,什麽時候都是一條
SQL%ROWCOUNT作爲隱性游標的一個屬性可以處理INSERT,DELETE,UPDATE和單行的SELECT INTO語句,沒有什麽差別的(除了SELECT祇能得到一行外)。


__________________
童年遙遙天邊,老年在遠方........
顶部
 
    


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问