oracle中sql%rowcount的作用

起因:新开发个存储过程,需要当一个用户调用存储过程操作一行数据时,另外的用户不允许调用过程操作该数据。

解决办法:先将该记录的状态改为处理中,当别的用户看到为处理中时则跳出过程。此时用到了sql%rowcount来判断是否更新了记录的状态

  1. update table t set t.status = 'processing' where t.id = P_ID and t.status <> 'processing' ;  
  2. if sql%rowcount = 0 then  
  3.   return;  
  4. end if;  


由于没有用过sql%rowcount,所以特意测试了一下,下面是对sql%rowcount功能的测试:

--先建个测试用表

  1. create table Z_TEMP  
  2. (  
  3.   C1 VARCHAR2(10),  
  4.   C2 VARCHAR2(10),  
  5.   C3 VARCHAR2(10)  
  6. );  

--向表中插入3行测试数据,插入后:

  1. C1         C2         C3  
  2. ---------- ---------- ----------  
  3. 1                       
  4. 2                       
  5. 3        

写了一段过程来测试:

  1. declare  
  2.   v_n number;  
  3. begin  
  4.   update z_temp t set t.c2 = '1' where t.c1 = 1; --更新一行记录 c1 = 1  
  5.   v_n := sql%rowcount;  
  6.   dbms_output.put_line('第1.0次:' || v_n);  
  7.   commit;  
  8.   v_n := sql%rowcount;  
  9.   dbms_output.put_line('第1.1次:' || v_n);--提交后sql%rowcounty已经为0了  
  10.     
  11.   update z_temp t set t.c2 = '2' where t.c1 = 2; --更新一行记录 c1 = 2  
  12.   v_n := sql%rowcount;  
  13.   dbms_output.put_line('第2次:' || v_n);  
  14.     
  15.   update z_temp t set t.c2 = '3'--更新三行记录  
  16.   v_n := sql%rowcount;  
  17.   dbms_output.put_line('第3次:' || v_n);  
  18.   commit;  
  19. end;  
  1. /*输出结果:  
  2. 第1.0次:1  
  3. 第1.1次:0  
  4. 第2次:1  
  5. 第3次:3  
  6. */  

执行后表中数据:

  1. C1         C2         C3  
  2. ---------- ---------- ----------  
  3. 1          3            
  4. 2          3            
  5. 3          3      

   

由此可见sql%rowcount只会记录未被提交的最后一条SQL语句的影响行数。这点很重要,如果想统计多个sql的合计影响行数,就必须在每个sql后面,用一个变量保存当前的sql%rowcount。

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值