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;
展开
 我来答
不惑出彩
2019-03-13 · 超过33用户采纳过TA的回答
知道答主
回答量:97
采纳率:84%
帮助的人:17.8万
展开全部
我感觉这个需求有点怪。。不过如果一定要这样,我的思路是循环各个分区,每个分区删100条,凑够10000条,commit,不过这样的话和你原来的语句比起来,相当于把一个delete操作拆成了100次,必然带来性能下降。不过你原来的语句也有问题啊。你指定了1w的数据,可是不能保证180天前的数据删除完。
更多追问追答
追问
我是1万次commit,删不完继续循环哇,现在继续在for循环里加了个循环已经能删成功数据了,但是这个输出n_delete是空字符,貌似没拿到值,还要去测试测试。
追答
如果你发的语句没改动的话,ndelete不会为空的,你有默认值,sqlrowcount又不可能为null,不应该出现null的情况
tj_angela
2019-03-13 · TA获得超过7530个赞
知道大有可为答主
回答量:6797
采纳率:75%
帮助的人:2620万
展开全部
rownum不能这样用, 是在筛选条件之前rownum就已经定了
追问
那我要控制提交条数怎么整要?加上了这个是全过滤出来了,但是只commit指定条数么
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
菜较往年谫
2019-03-13 · TA获得超过337个赞
知道小有建树答主
回答量:558
采纳率:60%
帮助的人:195万
展开全部
里面数据,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式