批量更新的陷阱?
記錄數與EXIT WHEN
測試表和過程如下:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL批量複製命令的六個陷阱PBSQL
- SQLServer批量更新SQLServer
- Laravel 批量更新Laravel
- 批量更新總結
- Oracle -- 批量更新sequence的儲存Oracle
- 如何批量更新資料
- pymysql批量更新資料MySql
- 資料庫-批量更新資料庫
- 批量更新效能比較
- ibatis對oracle資料庫的批量更新和批量插入的操作BATOracle資料庫
- oracle批量新增更新資料Oracle
- Mybatis批量更新三種方式MyBatis
- iOS FMDB 查詢 批量更新iOS
- 一句sql,批量更新SQL
- win系統下git程式碼批量克隆,批量更新Git
- zt_Oracle批量更新】根據一個大表批量更新另一大表的方法比較Oracle
- MySQL批量更新死鎖案例分析MySql
- hibernateHQl批量插入、刪除、更新
- 海量資料處理_批量更新
- Java爬坑日記之批量更新Java
- PHP配上MySQL實現批量更新插入PHPMySql
- pip–upgrade批量更新過期的python庫Python
- mybatis 批量新增insert、更新update詳解MyBatis
- 批量更新資料方法比較測試
- 批量更新時無法觸發事件的解決方法事件
- gitup: 批量更新多個 git 程式碼庫的小工具Git
- mysql語句:批量更新多條記錄的不同值[轉]MySql
- 批量更新SQL Server資料庫的使用者檢視SQLServer資料庫
- MySQL 批量更新、刪除資料shell指令碼MySql指令碼
- DocumentFragment文件碎片(高效批量更新多個節點)Fragment
- Mybatis批量更新SQL報錯☞解決辦法MyBatisSQL
- Ibatis批量更新資料(mysql資料庫)BATMySql資料庫
- mysql根據查詢結果批量更新多條資料(插入或更新)MySql
- MySQL NDB 批量更新100萬行資料MySql
- WebRTC 的三個“陷阱”Web
- JavaScript 的常見“陷阱”JavaScript
- dbca刪庫的陷阱
- Dynamics CRM 如何使用XrmToolBox中的Bulk Workflow Execution批量更新資料