有一张六百多万数据的表ref_ndairs,现在需要将里面的air_code字段的空格去掉。
数据量太大,直接更新比较困难。
以下是借助主键(序列)ndairs_seq分批更新的语句。
declare
type typ_min_n is table of number;
min_n typ_min_n;
max_n typ_min_n;
begin
select t.minn + level * 10000, t.minn + (level + 1) * 10000
bulk collect into min_n, max_n
from (select max(ndairs_seq) maxx, min(ndairs_seq) minn
from ref_ndairs) t
where t.maxx > t.minn + level * 10000
connect by level < 3000;--这个3000是我随便给的值,由于where条件的限制,子表t中实际生成600多条数据
for i in min_n.first .. min_n.last loop
execute immediate ' update ref_ndairs set air_code = trim(air_code)
where ndairs_seq >= :min_na and ndairs_seq <= :max_na'
using min_n(i), max_n(i);
commit;
end loop;
end;
/
虽然比较简单,但由于以前没用过,记下来已被后续使用。
执行结束后通过语句查询:(由于以前没执行过该语句,所以时间差是准确的)
select first_load_time,last_active_time,executions from v$sql where sql_text like '% update ref_ndairs %';
FIRST_LOAD_TIME LAST_ACTIVE_TIME EXECUTIONS
1 2013-07-10/15:22:30 2013-7-10 15:25:58 621
执行时间约为3分28秒,更新数据6213551条
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26451536/viewspace-765975/
,如需转载,请注明出处,否则将追究法律责任。