早前在做一个短信接口时,客户端通过webservice接口发送短信请求,我用一个PLSQL存储过程接收后进行一些处理,然后返回一个处理结果,其中有一段是这样的:
大致意思是把短信申请中号码有效的部分进行发送,然后返回总共成功了多少条。当查询的基表数据量比较大,或者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,语句操作的记录数
那么上述的例子中取数量的语句,就可以改为简单的赋值语句了:
看几个例子:
1.INSERT语句的游标属性,指向最近执行的一条SQL
2.UPDATE语句的游标属性
3.MERGE语句的游标属性,返回的数量是指INSERT和UPDATE的总数
4.DELETE语句的游标属性
5.SELECT INTO语句的游标属性