系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 数据库 > oracle > 详细页面

oracle中sql%rowcount的作用详解

时间:2023-10-31来源:系统城装机大师作者:佚名

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

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

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

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

--先建个测试用表

1
2
3
4
5
6
create table Z_TEMP 

  C1 VARCHAR2(10), 
  C2 VARCHAR2(10), 
  C3 VARCHAR2(10) 
);

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

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

写了一段过程来测试:

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

/*输出结果:  

第1.0次:1  

第1.1次:0  

第2次:1  

第3次:3  

*/  

执行后表中数据:

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

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

分享到:

相关信息

  • Oracle数据库的系统结构

    1.Oracle数据库系统结构概述 2.Oracle数据库存储结构 物理存储结构 控制文件 数据文件 重做日志文件 归档日志文件 Oracle数据库逻辑结构 数据块(Data Block) (盘)区(Extent) 段(Segment) 表空间(Tablespace) 本地管...

    2023-10-31

  • Oracle19c最新版保姆级别最详细的安装配置教程

    windows下的Oracle19c 一、官网下载Oracle19c数据库 二、安装Oracle数据库 1.解压安装包 2.运行setup.exe安装 三、配置 四、安装完Oracle数据库,给scott用户解锁 1.解决Oracle数据库中没有scott账户的问题 2.给scott...

    2023-10-31

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载