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
@H_502_152@C1C2C3
  • ------------------------------1
  • 2
  • 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
    @H_502_152@/*输出结果:
  • 第1.0次:1
  • 第1.1次:0
  • 第2次:1
  • 第3次:3
  • */
  • 执行后表中数据:

    copy
    @H_502_152@13
  • 23
  • 33

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

    猜你在找的Oracle相关文章