sql%bulk_rowcount && sql%rowcount 的使用

说明:

%BULK_ROWCOUNT 属性计算FORALL迭代影响行数
  在进行SQL数据操作语句时,SQL引擎打开一个隐式游标(命名为SQL),该游标的标量属性(scalar attribute)有 %FOUND, %ISOPEN, %NOTFOUND, and %ROWCOUNT。
  FORALL语句除具有上边的标量属性外,还有个复合属性(composite  attribute):%BULK_ROWCOUNT,该属性具有索引表(index-by  table)语法。它的第i个元素存贮SQL语句(INSERT,  UPDATE或DELETE)第i个执行的处理行数。如果第i个执行未影响行,%bulk_rowcount  (i),返回0。FORALL与%bulk_rowcount属性使用相同下标

--%bulk_rowcount 代码 :

 1 /*
 2 drop table TESTT ;
 3 CREATE TABLE TESTT(TID varchar2(100)) ;
 4 TRUNCATE TABLE TESTT ;
 5 SELECT * FROM TESTT ;
 6
 7 */
 8
 9 DECLARE
10   type stp_index is table of sys_product.productcode%type;
11   --idx_tab stp_index :=number_index(null) ;
12   idx_tab stp_index;
13   cursor cur_stp is
14     select productcode pcode from sys_product;
15
16 BEGIN
17 ----新增
18  open cur_stp;
19   loop
20     fetch cur_stp bulk collect
21       into idx_tab;
22     exit when cur_stp%notfound;
23   end loop;
24    close cur_stp ;
25   forall cur in idx_tab.first .. idx_tab.last
26     insert into testt values (idx_tab(cur));
27       dbms_output.put_line(‘insert --------------‘ ||sql%rowcount);
28   for i in idx_tab.first .. idx_tab.count loop
29     dbms_output.put_line(idx_tab(i)||‘ insert 受影响行为 ‘ || sql%bulk_rowcount(i)||‘ 行 !‘);
30   end loop;
31   COMMIT;
32 --修改
33   forall cur in idx_tab.first .. idx_tab.last
34    update testt set tid=idx_tab(cur)||‘ % ‘ where tid=idx_tab(cur);
35       dbms_output.put_line(‘update --------------‘ ||sql%rowcount);
36    for i in idx_tab.first .. idx_tab.count loop
37     dbms_output.put_line(idx_tab(i)||‘ update 受影响行为 ‘ || sql%bulk_rowcount(i)||‘ 行 !       ‘||  sql%rowcount);
38   end loop;
39 END;

---结果:

 1 insert --------------19
 2 GFWD insert 受影响行为 1 行 !
 3 GOPTION insert 受影响行为 1 行 !
 4 NCD insert 受影响行为 1 行 !
 5 GLS insert 受影响行为 1 行 !
 6 IBO insert 受影响行为 1 行 !
 7 REPO insert 受影响行为 1 行 !
 8 OBPO insert 受影响行为 1 行 !
 9 BSD insert 受影响行为 1 行 !
10 DEPO insert 受影响行为 1 行 !
11 IRS insert 受影响行为 1 行 !
12 FXSWAP insert 受影响行为 1 行 !
13 FRA insert 受影响行为 1 行 !
14 IBL insert 受影响行为 1 行 !
15 FXFWD insert 受影响行为 1 行 !
16 CCS insert 受影响行为 1 行 !
17 FXOPTION insert 受影响行为 1 行 !
18 GSWAP insert 受影响行为 1 行 !
19 BSDC insert 受影响行为 1 行 !
20 CI insert 受影响行为 1 行 !
21 update --------------19
22 GFWD update 受影响行为 1 行 !       19
23 GOPTION update 受影响行为 1 行 !       19
24 NCD update 受影响行为 1 行 !       19
25 GLS update 受影响行为 1 行 !       19
26 IBO update 受影响行为 1 行 !       19
27 REPO update 受影响行为 1 行 !       19
28 OBPO update 受影响行为 1 行 !       19
29 BSD update 受影响行为 1 行 !       19
30 DEPO update 受影响行为 1 行 !       19
31 IRS update 受影响行为 1 行 !       19
32 FXSWAP update 受影响行为 1 行 !       19
33 FRA update 受影响行为 1 行 !       19
34 IBL update 受影响行为 1 行 !       19
35 FXFWD update 受影响行为 1 行 !       19
36 CCS update 受影响行为 1 行 !       19
37 FXOPTION update 受影响行为 1 行 !       19
38 GSWAP update 受影响行为 1 行 !       19
39 BSDC update 受影响行为 1 行 !       19
40 CI update 受影响行为 1 行 !       19

--sql%rowcount  && cursor%rowcount ;

 1 declare
 2   cursor cur_stp is
 3     select s.productcode pcode from sys_product s;
 4   TID varchar2(100);
 5 begin
 6   open cur_stp;
 7   dbms_output.put_Line(‘0_cur_stp%rowcount=‘||cur_stp%rowcount);
 8   loop
 9     fetch cur_stp
10       into tid;
11       --注意这里没有换行;
12     dbms_output.put(cur_stp%rowcount||‘ ‘); --‘0~19‘
13     exit when cur_stp%notfound;
14   end loop;
15   --放到游标里面和外面的区别;
16   dbms_output.put_Line(‘sql%rowcount=‘ || sql%rowcount);
17   dbms_output.put_Line(‘1_cur_stp%rowcount=‘ || cur_stp%rowcount);
18   close cur_stp;
19
20   for i in cur_stp loop
21     dbms_output.put_Line(cur_stp%rowcount || ‘--‘ || i.pcode);
22   end loop;
23   --放到底部的话会 抛错 :无效的游标;  dbms_output.put_Line(cur_stp%rowcount);
24 end;

--结果:

 1 0_cur_stp%rowcount=0
 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 19 sql%rowcount=
 3 1_cur_stp%rowcount=19
 4 1--GFWD
 5 2--GOPTION
 6 3--NCD
 7 4--GLS
 8 5--IBO
 9 6--REPO
10 7--OBPO
11 8--BSD
12 9--DEPO
13 10--IRS
14 11--FXSWAP
15 12--FRA
16 13--IBL
17 14--FXFWD
18 15--CCS
19 16--FXOPTION
20 17--GSWAP
21 18--BSDC
22 19--CI

原文地址:https://www.cnblogs.com/linbo3168/p/9026215.html

时间: 2024-10-11 05:42:13

sql%bulk_rowcount && sql%rowcount 的使用的相关文章

SQL Server中@@ROWCOUNT的用法

SQL Server中@@ROWCOUNT返回受上一语句影响的行数,返回值类型为 int 整型. 如果行数大于 20 亿,则需要使用 ROWCOUNT_BIG. @@ROWCOUNT和@@ERROR变量的值,在执行完一条语句后总是会发生变化,所以我们将他们作为判断的依据的时候应该首先保存在局部变量中.他们反映的都是紧接着的上一条语句对他们的影响! 我们通常可以通过update.insert语句并使用@@ROWCOUNT来检测是否更改了任何一些行. 下面介绍一个使用@@ROWCOUNT的实例: S

Hibernate SQL实际sql语句监控- p6spy+hibernate+proxool 设置

由于ORM工具的缘故,我们调试程序的时候远没有直接在程序里直接写个string的SQL简单,想当年查个sql是有多么的幸福,一行sql = "select * from ..."找找就行了, 现在用了hibernate, 就算在JPA中开了show_sql=true, 打出来的还是一串 "name = ? and id = ? " 好在找到一个工具, p6spy, 作为真正JDBC的一个代理, 截获了所有sql, 让我们看到一个真实sql的机会. 先下载,以下配置默

【SQL】sql版Split函数。用于拆分字符串为单列表格

原文:[SQL]sql版Split函数.用于拆分字符串为单列表格 功能与.net版string.Split函数类似,只不过.net返回的是数组,这个返回的是一个单列表格,每个拆分出来的子串占一行.可选是否移除空格子串和重复项.市面上类似的函数不算少,但大多都是在循环中对原串进行改动,我感觉这样不好,虽然不知道sql的字符串是不是像.net的一样具有不可变性,但感觉尽量不要去动原串最好,万一sql的字串也不可变,那变一次就要产生一份,尤其是每圈循环都在变,内存消耗让人心疼,所以才有重新造个轮子的想

使用showplan.sql分析sql Performance

在HelloDBA网站找到一个分析sql性能的工具-showplan,记录一下 showplan.sql下载路径:http://www.HelloDBA.com/Download/showplan.zip 使用方式就是调用该工具,传入SQL_ID作为参数. SQL> @/dmp/showplan.sql 26xj87b2f8g6u Usage: @showplan <SQL_ID> [Plan Hash Value] [Details: [+](B)inds|SQL (T)ext|(Pe

SQL Server SQL性能优化之--通过拆分SQL提高执行效率,以及性能高低背后的原因

复杂SQL拆分优化 拆分SQL是性能优化一种非常有效的方法之一, 具体就是将复杂的SQL按照一定的逻辑逐步分解成简单的SQL,借助临时表,最后执行一个等价的逻辑,已达到高效执行的目的 一直想写一遍通过拆分SQL来优化的博文,最近刚好遇到一个实际案例,比较有代表性,现分享出来, 我们来通过一个案例来分析,为什么拆分语句可以提高SQL执行效率,更重要的是弄清楚,拆分前为什么慢,拆分后为什么快了? 幼稚的话,各位看官莫笑 先看一下相关表的数据量,大表也有5900多万,小表有160多万 (声明:我从来没

查询Oracle正在运行SQL的SQL命令

查询Oracle正在运行SQL的SQL命令: select a.EVENT, a.SQL_ID, a.MACHINE, b.SQL_TEXT, b.SQL_FULLTEXT,b.FIRST_LOAD_TIME,b.LAST_LOAD_TIME,b.LAST_ACTIVE_TIME from v$session a, v$sql b where a.SQL_ID = b.SQL_ID and a.USERNAME is not null and a.STATUS = 'ACTIVE'

[sql异常]SQL Server 阻止了对组件 &#39;Ad Hoc Distributed Queries&#39; 的

//执行远程数据库表查询 select * from openrowset( 'SQLOLEDB', '192.168.5.547'; 'sa'; '密码',[数据库名称].[dbo].[表名]) 出现异常: 消息 15281,级别 16,状态 1,第 1 行SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭.系统管理员

2.PL/SQL——PL/SQL概述及其基本结构

一.什么是PL/SQL PL/SQL是对SQL语言的扩展. SQL语言是一种非过程性语言,即用户只需要告诉计算机做什么,而不需要理解计算机是怎么做的.比如用户要查询一张表里的某一列数据,只需要输入:selectCOLUNM_NAME from TABLE_NAME where CONDITION:就可以了,而不需要了解计算机是如何查询的.这既是优点也是缺点,优点就是该语言非常容易学习,缺点则是缺乏过程控制,限制了其功能,比如无法进行if...else的条件判断,也无法进行for循环操作. 基于S

对SQL Server SQL语句进行优化的10个原则

1.使用索引来更快地遍历表. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存放在数据页上.合理的索引设计要建立在对各种查询的分析和预测上.一般来说:①.有大量重复值.且经常有范围查询(between, >,< ,>=,< =)和order by.group by发生的列,可考虑建立群集索引:②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引:③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列. 2.IS NUL