免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1438 | 回复: 4
打印 上一主题 下一主题

这个shell写的很苯,求优化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-18 17:38 |只看该作者 |倒序浏览
  我想实现把一个表里的一个月前数据导入到备份表里去
然后吧,备份表里大于3个月的数据删除


Date1=`date '+20%y%m%d'`

sqlplus maps/maps <<EOF

INSERT INTO outTable_bak select * from outTable where to_number(replace(outdate ,'-','')+30) < to_number('$Date1') ;

delete from outTable t where to_number(replace(outdate ,'-','')+30) < to_number('$Date1') ;

delete from outTable_bak h where to_number(replace(outdate ,'-','')+90) < to_number('$Date1') ;

EOF


这是我写的,有没有更好的办法,而且这个算时间的办法好像有问题

论坛徽章:
0
2 [报告]
发表于 2005-06-19 17:13 |只看该作者

这个shell写的很苯,求优化

我尝试着看,觉得你做的是
(1)把outTable表里最近一个月的数据插到outTable_bak表里去。
(2)删除掉outTable表里这个月的记录。
(3)删除掉outTable_bak表里上三个月前的记录。
个人觉得逻辑上没什么问题。
至于你说的算时间的办法,呵呵,我不太懂,能举个例子吗?

论坛徽章:
0
3 [报告]
发表于 2005-06-19 17:18 |只看该作者

这个shell写的很苯,求优化

不过我有个疑问,从逻辑上来说:
    按照你的要求,outTable每个月的记录导出后,都要删除掉,也就是一月一清空,即是说outTable表里始终只能有当前月的记录,而这些记录被导出后,整个表是要被清空的。
     所以,第二个sql语句为什么不直接用:
     delete from outTable;
       呢?

论坛徽章:
0
4 [报告]
发表于 2005-06-19 19:00 |只看该作者

这个shell写的很苯,求优化

1、首先,outTable是每天增加的,如果delete from outTable 就会把当前月份的数据删掉。

2、我所说的时间算法有问题是指,date型是30进位的,to_number以后变成百进位了,肯定有问题啊,呵呵

论坛徽章:
0
5 [报告]
发表于 2005-06-19 22:50 |只看该作者

这个shell写的很苯,求优化

原帖由 "hnic" 发表:
1、首先,outTable是每天增加的,如果delete from outTable 就会把当前月份的数据删掉。

2、我所说的时间算法有问题是指,date型是30进位的,to_number以后变成百进位了,肯定有问题啊,呵呵

即使是30进位又如何?一个月也不一定就是30天吧。
日期比较就应该用日期类型就比较嘛,直接用oracle里面的日期函数就行了吧。

INSERT INTO outTable_bak select * from outTable where outdate<add_months(sysdate,-1);
delete from outTable t where outdate < add_months(sysdate,-1);
delete from outTable_bak h whereoutdate <add_months(sysdate,-3);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP