sql%rowcount
sql%rowcount用于记录修改的条数,就如你在sqlplus下执行delete from之后提示已删除xx行一样, 这个参数必须要在一个修改语句和commit之间放置,否则你就得不到正确的修改行数。
例如:
SQL> declare n number;
2 begin
3 insert into test_a select level lv from dual connect by level<500;
4 n:=sql%rowcount;
5 commit;
6 dbms_output.put_line(n);
7 end;
8 /
499
PL/SQL procedure successfully completed.
SQL> declare n number;
2 begin
3 insert into test_a select level lv from dual connect by level<500;
4 commit;
5 n:=sql%rowcount;
6 dbms_output.put_line(n);
7 end;
8 /
如果我连续执行了3个select语句
然后调用sql%rowcount,得到的结果是最后一个select的条数。 要统计所有的,可以使用三个变量接收sql%rowcount,然后相加即可,不过貌似直接select的写法无法使用sql%rowcount。
以下转自
http://www.eygle.com/archives/2005/04/oracleoeouaeeae.html
测试过Delete和For all两种方法,for all在这里并没有带来性能提高,所以仍然选择了批量直接删除。
create or replace procedure delBigTab(p_TableName in varchar2,
p_Condition in varchar2,
p_Count in varchar2)
aspragma autonomous_transaction;
n_delete number := 0;
begin
while 1 = 1 loopEXECUTE IMMEDIATE 'delete from ' || p_TableName || ' where ' || p_Condition || ' and rownum <= :rn' USING p_Count;
if SQL%NOTFOUND thenexit; elsen_delete := n_delete + SQL%ROWCOUNT;
end if;
commit;
end loop;
commit;
DBMS_OUTPUT.PUT_LINE('Finished!'); DBMS_OUTPUT.PUT_LINE('Totally ' || to_char(n_delete) || ' records deleted!');
end;
以下是删除过程及时间:
SQL> create or replace procedure delBigTab2 (3 p_TableName in varchar2,4 p_Condition in varchar2,5 p_Count in varchar26 )7 as8 pragma autonomous_transaction;9 n_delete number:=0;10 begin11 while 1=1 loop12 EXECUTE IMMEDIATE13 'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'14 USING p_Count;15 if SQL%NOTFOUND then16 exit;17 else18 n_delete:=n_delete + SQL%ROWCOUNT;19 end if;20 commit;21 end loop;22 commit;23 DBMS_OUTPUT.PUT_LINE('Finished!');24 DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');25 end;26 /Procedure created.SQL> set timing on SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY;MIN(NUMDLFLOGGUID) ------------------11000000Elapsed: 00:00:00.23 SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11100000','10000');PL/SQL procedure successfully completed.Elapsed: 00:00:18.54 SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY;MIN(NUMDLFLOGGUID) ------------------11100000Elapsed: 00:00:00.18 SQL> set serveroutput on SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11200000','10000'); Finished! Totally 96936 records deleted!PL/SQL procedure successfully completed.Elapsed: 00:00:18.61 10万记录大约19sSQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11300000','10000'); Finished! Totally 100000 records deleted!PL/SQL procedure successfully completed.Elapsed: 00:00:18.62 SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11400000','10000'); Finished! Totally 100000 records deleted!PL/SQL procedure successfully completed.Elapsed: 00:00:18.85 SQL> SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 13000000','10000'); Finished! Totally 1000000 records deleted!PL/SQL procedure successfully completed.Elapsed: 00:03:13.87100万记录大约3分钟 SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 20000000','10000');Finished! Totally 6999977 records deleted!PL/SQL procedure successfully completed.Elapsed: 00:27:24.69 700万大约27分钟以上过程仅供参考.
sql%rowcount相关推荐
- oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen
Oracle 存储过程 删除表记录时删除不存在的记录也是显示删除成功 create or replace procedure delDept(p_deptno in dept.deptno%type) ...
- oracle中的sql%rowcount
sql%rowcount中的sql是oracle的内部游标,rowcount的意思是之前的dml sql语句影响的多少行数据. 如果是delete操作rowcount就是delete的数据,如果是in ...
- sql%rowcount转mysql_Oracle光速入门二 ——马士兵Oracle视频讲义笔记
其实Oracle的管理没传说中那么难,刚到地税局搞运维,我基本就不会Oracle,仅仅熟悉MySQL,这东西听听课,只要笔记做得好,根本不用往脑子里记,用的时候翻出来照着颜色往上敲,就这么简单,又不是 ...
- oracle中 sql%rowcount 用法
sql%rowcount用于记录修改的条数,必须放在一个更新或者删除等修改类语句后面执行,select语句用于查询的话无法使用, 当你执行多条修改语句时,按照sql%rowcount 之前执行的最后一 ...
- oracle sql%rowcount 返回影响行数
sqlserver中,返回影响行数是:If @@RowCount<1 oracle中,返回影响行数是:If sql%rowcount<1 例: sqlserver: AS BEGIN Up ...
- SQL中的sql%rowcount
sql%rowcount 的作用:记录修改的条数,当你进行删除,更新操作的时候,可以提示已删除\更新的行数,这个参数放在修改语句和commit之间 例如: SQL> declare v_coun ...
- SQL%BULK_ROWCOUNT 和SQL%ROWCOUNT的区别
sql%rowcount中的sql是oracle的内部游标,rowcount的意思是之前的dml sql语句影响的多少行数据.这个参数必须要在一个修改语句和commit之间放置,否则你就得不到正确的修 ...
- oracle rowcount(),oracle 之 sql%rowcount 查看受影响的记录行数
sql%rowcount必须在commit或者rollback之前 create or replace procedure t_ts(TABLE_NAME VARCHAR2) AS n num ...
- oracle存储过程rowcount用法,oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen...
sql%rowcount用于记录修改的条数,就如你在sqlplus下执行delete from之后提示已删除xx行一样,这个参数必须要在一个修改语句和commit之间放置,否则你就得不到正确的修改行数 ...
最新文章
- 超级实用的linux 下shell快捷键汇总
- 帝国cms7.5多终端刷新单条内容信息时不起作用的解决方法
- C++中的yield和fork
- IE8中HTTP连接数目的变化
- yolov4论文_YOLOv4论文详细解读
- python面试题总结(2)--编码规范
- oracle更新blol字段超长,oracle - 将对象值插入表PL / SQL而无需指定属性 - 堆栈内存溢出...
- JVM初学之堆的内存模型
- CKEditor 4.14 发布,支持复制粘贴 LibreOffice 文档
- 转载 Assert断言知识
- 深度学习入门——波士顿房价预测
- 使用javamail通过代理发送邮件
- ggplot2图集汇总(一)
- 管理感情:工作犯错了,不要狡辩,不要把错误推到别人身上
- 电脑蓝屏0x0000006B不重装系统的解决办法
- JS设计模式与开发实践
- 【计算机网络】网络层(六)—— IP组播与移动IP
- vmgsim 完整好用已经测试REFORM-3PC
- PyG搭建GCN实现链接预测
- 感谢在俄勒冈州Develo的SAOs软件协会参加我的演讲“音乐背后的Web服务”的所有人...