你可以写一个存储过程来执行,由于数据量大,如果直接更新,数据库UNDO表空间肯定会满,会产生异常。
创新互联公司专注于北京企业网站建设,成都响应式网站建设公司,商城系统网站开发。北京网站建设公司,为北京等地区提供建站服务。全流程定制网站设计,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务
过程如下,给你参考下。
CREATE OR REPLACE PROCEDURE UPDATE_TABLES
AS
TYPE T_MW IS TABLE OF ROWID;
T_T_MW T_MW;
CURSOR V_CUR IS
SELECT ROWID FROM T ;
BEGIN
OPEN V_CUR;
LOOP
FETCH V_CUR BULK COLLECT
INTO T_T_MW LIMIT 80000;
FOR C1 IN 1 .. T_T_MW.COUNT LOOP
UPDATE T NOLOGGING
SET 要改的列
WHERE ROWID=T_T_MW(C1);
END LOOP;
COMMIT;
EXIT WHEN V_CUR%NOTFOUND;
END LOOP;
CLOSE V_CUR;
COMMIT;
END;
该过程可一次提交80000行。你也可以根据需求改。
可通过以下方法:
以100条数据为例,如果海量数据可参考。
如test表中有如下数据:
现要将begintime改成当前时间,每10条提交一次。
可用如下存储过程:
declare
i int;--定义变量
v_count int;--定义变量
v_loop int;--定义变量
begin
select count(*) into v_count from test;--计算表内数据总数
select ceil(v_count/10) into v_loop from dual;--计算需要循环次数
i:=1;--为i赋值
while i=v_loop loop--循环退出条件
update test set begintime=sysdate where begintime is null and rownum=10;--执行更新
commit;--提交
i:=i+1;--i依次加1
end loop;--结束循环
end;
如果是日期最小的记录,可以直接用min。
update org_info
set op_type = 1
where occur_date in (select min(occur_date) from org_info group by id)
1、按时间分区表创建: 其中add_date_time为分区字段,每一年一个分区。插入100W数据。
2、增加一个分区,分两种情况:1.没有maxvalue分区。2.有maxvalue分区。
3、创建的分区就是没有maxValue的分区,没有maxvalue分区添加新分区。
4、有maxvalue分区添加新分区:有了maxvalue,就不能直接add partition,而是需要max分区split。
5、合并分区,相邻的分区可以merge为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区,原先的局部索引相应也会合并,全局索引会失效,需要rebuild。