用SQL%ROWCOUNT返回SQL语句的影响数量

时间:2023-01-10 22:55:10

早前在做一个短信接口时,客户端通过webservice接口发送短信请求,我用一个PLSQL存储过程接收后进行一些处理,然后返回一个处理结果,其中有一段是这样的:

用SQL%ROWCOUNT返回SQL语句的影响数量

大致意思是把短信申请中号码有效的部分进行发送,然后返回总共成功了多少条。当查询的基表数据量比较大,或者SQL的处理逻辑本身比较慢的时候,这种做法效率就显得太低了。比如另外一个更常见的场景是根据输入文本模糊查找企业清单,同时返回结果数:

用SQL%ROWCOUNT返回SQL语句的影响数量

一样的SQL执行了2遍,而且每遍执行的时间比较长,这种情况下可以用到SQL%ROWCOUNT属性。

SQL%ROWCOUNT是一个游标属性,而SQL中的DML操作实际上是一种隐式的游标操作,在做INSERT,UPDATE,DELETE,MERGE以及SELECT INTO操作时,Oracle会打开一个始终指向最近执行的SQL语句的隐式游标,这个游标有3个常用的属性:

(1)SQL%FOUND,有记录被修改,返回TRUE

(2)SQL%NOTFOUND,没有记录被修改,返回TRUE

(3)SQL%ROWCOUNT,语句操作的记录数

那么上述的例子中取数量的语句,就可以改为简单的赋值语句了:

用SQL%ROWCOUNT返回SQL语句的影响数量

看几个例子:

1.INSERT语句的游标属性,指向最近执行的一条SQL

用SQL%ROWCOUNT返回SQL语句的影响数量

2.UPDATE语句的游标属性

用SQL%ROWCOUNT返回SQL语句的影响数量

3.MERGE语句的游标属性,返回的数量是指INSERT和UPDATE的总数

用SQL%ROWCOUNT返回SQL语句的影响数量

4.DELETE语句的游标属性

用SQL%ROWCOUNT返回SQL语句的影响数量

5.SELECT INTO语句的游标属性

用SQL%ROWCOUNT返回SQL语句的影响数量