ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 批量更新的陷阱?

批量更新的陷阱?

原创 Linux操作系统 作者:husthxd 时间:2006-03-03 00:00:00 0 删除 编辑

记录数与EXIT WHEN %NOTFOUND;的位置关系.


测试表和过程如下:

drop table test_log
/

create table test_log
(
message varchar2(50)
)
/

drop table test_1
/

create table test_1
as
select object_id ,object_name
from dba_objects
/
insert into test_1 select * from test_1
/
insert into test_1 select * from test_1
/
commit
/

-- 记录数有227760条

drop table test_2
/
create table test_2
as
select object_id ,object_name
from dba_objects
where 1=2
/

CREATE OR REPLACE PROCEDURE sp_gd_cs_test
IS
TYPE t_id IS TABLE OF test_1.object_id%TYPE;

TYPE t_name IS TABLE OF test_1.object_name%TYPE;

v_id t_id;
v_name t_name;
v_count NUMBER (10);
v_i NUMBER (10);

CURSOR cur_t
IS
SELECT *
FROM test_1;
BEGIN
DELETE test_log;

DELETE test_2;

COMMIT;
v_i := 1;

OPEN cur_t;

LOOP
FETCH cur_t
BULK COLLECT INTO v_id,
v_name LIMIT 10000;

v_count := cur_t%ROWCOUNT;

INSERT INTO test_log
VALUES ( '第'
|| v_i
|| '次:记录条数:'
|| v_count
);

FORALL i IN 1 .. v_id.COUNT
INSERT INTO test_2
VALUES (v_id (i),
v_name (i)
);
v_i := v_i
+ 1;
EXIT WHEN cur_t%NOTFOUND;
END LOOP;

CLOSE cur_t;
END;
/


SQL>exec sp_gd_cs_test;

SQL> select count(*) from test_2
2 /

COUNT(*)
----------
227760

这是正确的.

把 EXIT WHEN cur_t%NOTFOUND;放在Fetch后面,再执行一次:

SQL>exec sp_gd_cs_test;

SQL> select count(*) from test_2
2 /

COUNT(*)
----------
220000

结果把最后7760条记录忽略了.

查看文档中......

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-21992/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 如此创建索引
下一篇: 业务胜于技术
请登录后发表评论 登录
全部评论
长期从事政务、金融等行业产品研发和架构设计工作,对Oracle、PostgreSQL以及大数据等相关技术有深入研究。现就职于广州云图数据技术有限公司,系统架构师。

注册时间:2007-12-28

  • 博文量
    1177
  • 访问量
    3641527