怎么样实现循环删除操作

syilo 2005-11-16 06:35:30
表:TAB1 有1000多万条记录,有一个字段:T_DATE
要从表TAB1中按T_DATE删除10月份的数据

由于删除的数据过多,
各位大侠,能不能写一个SQL语句,实现删除1000条记录就commit一下;
...全文
247 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobfang 2005-11-16
  • 打赏
  • 举报
回复
set serveroutput on
declare
i number:=0;
rows number:=10000;
begin
loop
delete TABLENAME where rownum<=rows and ...;
i := SQL%ROWCOUNT+i;
dbms_output.put_line('delete '||i||' rows');
commit;
exit when i<>rows;
end loop;
end;
/
Love001 2005-11-16
  • 打赏
  • 举报
回复
可以用游标,然后循环,再循环体内部delete\commit
沝林 2005-11-16
  • 打赏
  • 举报
回复
还有注意上面用的是forall,对于大数据量进行插入删除更新的时候 ,有时候用forall要比一般游标和for循环要快很多的,你可以自己用两 种方法比较下再 做取舍。
沝林 2005-11-16
  • 打赏
  • 举报
回复
对大数据量用bulk collect实现批量删除,效率会高很多,下面在9i下测试通过

CREATE OR REPLACE PROCEDURE bulkdelete AS

TYPE T_DATE_t IS TABLE OF TAB1.T_DATE%TYPE;

T_DATE_array T_DATE_t;

CURSOR c1 IS
SELECT T_DATE FROM tab1 WHERE extract(MONTH FROM T_DATE) = 10;

BEGIN
OPEN c1;
LOOP
FETCH c1 BULK COLLECT INTO T_DATE_array LIMIT 1000; --一次删除1000条
FORALL i IN T_DATE_array.FIRST .. T_DATE_array.LAST
DELETE FROM tab1 WHERE T_DATE = T_DATE_array(i);

EXIT WHEN c1%NOTFOUND;
END LOOP;

CLOSE c1;

COMMIT;

EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END bulkdelete;

17,378

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧