oracle中sql%rowcount的作用

前端之家收集整理的这篇文章主要介绍了oracle中sql%rowcount的作用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

  1. updatetabletsett.status='processing'wheret.id=P_IDandt.status<>;
  2. ifsql%rowcount=0then
  3. returnendif;


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

--先建个测试用表

copy
    createZ_TEMP
  1. (
  2. C1VARCHAR2(10),
  3. C2VARCHAR2(10),
  4. C3VARCHAR2(10)
  5. );

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

copy
    C1C2C3
  1. ------------------------------1
  2. 2
  3. 3

写了一段过程来测试:

copy
    declare
  1. v_nnumber;
  2. beginupdatez_temptsett.c2='1'wheret.c1=1;--更新一行记录c1=1v_n:=sql%rowcount;
  3. dbms_output.put_line('第1.0次:'||v_n);
  4. commitv_n:=sql%rowcount;
  5. dbms_output.put_line('第1.1次:'||v_n);--提交后sql%rowcounty已经为0了
  6. z_temptt.c2='2't.c1=2;--更新一行记录c1=2'第2次:'||v_n);
  7. '3';--更新三行记录'第3次:'commit;
  8. end;
copy
    /*输出结果:
  1. 第1.0次:1
  2. 第1.1次:0
  3. 第2次:1
  4. 第3次:3
  5. */

执行后表中数据:

copy
    13
  1. 23
  2. 33

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

猜你在找的Oracle相关文章