Oracle sql 删除一张大表里面数据,指定行数commit怎么写呀
表是根据一个key(0-99)字段的分区表,删除event_date180天前的数据,1万行一commit.我用for循环key0-99来删如下,实际结果是0到99是循环...
表是根据一个key(0-99)字段的分区表,删除event_date 180天前的数据,1万行一commit.
我用for循环key 0-99来删如下,实际结果是0到99是循环了一次 ,但是每个key下面只删了一次,也就是1万条,并没有在各个key下面循环删除直到符合条件的记录行数为0的。是要在for循环里面再加一个循环?试过速度变得很慢。还有用游标写删的是不是更快?
DECLARE
n_delete number:=0;
begin
for i in 0..99
loop
delete from test312 where key = i and event_date <=sysdate -180 and rownum<=10000;
if SQL%NOTFOUND then
exit;
else
n_delete:=n_delete + SQL%ROWCOUNT;
end if;
commit;
end loop;
DBMS_OUTPUT.PUT_LINE( 'Totally' ||to_char(n_delete)|| 'records deleted!');
end; 展开
我用for循环key 0-99来删如下,实际结果是0到99是循环了一次 ,但是每个key下面只删了一次,也就是1万条,并没有在各个key下面循环删除直到符合条件的记录行数为0的。是要在for循环里面再加一个循环?试过速度变得很慢。还有用游标写删的是不是更快?
DECLARE
n_delete number:=0;
begin
for i in 0..99
loop
delete from test312 where key = i and event_date <=sysdate -180 and rownum<=10000;
if SQL%NOTFOUND then
exit;
else
n_delete:=n_delete + SQL%ROWCOUNT;
end if;
commit;
end loop;
DBMS_OUTPUT.PUT_LINE( 'Totally' ||to_char(n_delete)|| 'records deleted!');
end; 展开
3个回答
展开全部
我感觉这个需求有点怪。。不过如果一定要这样,我的思路是循环各个分区,每个分区删100条,凑够10000条,commit,不过这样的话和你原来的语句比起来,相当于把一个delete操作拆成了100次,必然带来性能下降。不过你原来的语句也有问题啊。你指定了1w的数据,可是不能保证180天前的数据删除完。
更多追问追答
追问
我是1万次commit,删不完继续循环哇,现在继续在for循环里加了个循环已经能删成功数据了,但是这个输出n_delete是空字符,貌似没拿到值,还要去测试测试。
追答
如果你发的语句没改动的话,ndelete不会为空的,你有默认值,sqlrowcount又不可能为null,不应该出现null的情况
展开全部
rownum不能这样用, 是在筛选条件之前rownum就已经定了
追问
那我要控制提交条数怎么整要?加上了这个是全过滤出来了,但是只commit指定条数么
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
里面数据,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询