时间: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。
2023-10-31
Oracle如何编写一个sqlldr实例2023-10-31
Oracle的SQLLDR用法简介2023-10-31
Oracle中的高效SQL编写PARALLEL解析1.Oracle数据库系统结构概述 2.Oracle数据库存储结构 物理存储结构 控制文件 数据文件 重做日志文件 归档日志文件 Oracle数据库逻辑结构 数据块(Data Block) (盘)区(Extent) 段(Segment) 表空间(Tablespace) 本地管...
2023-10-31
windows下的Oracle19c 一、官网下载Oracle19c数据库 二、安装Oracle数据库 1.解压安装包 2.运行setup.exe安装 三、配置 四、安装完Oracle数据库,给scott用户解锁 1.解决Oracle数据库中没有scott账户的问题 2.给scott...
2023-10-31