免费注册 查看新帖 |

Chinaunix

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

批量更新表字段日期值的存储过程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-09 17:04 |只看该作者 |倒序浏览
今天由于测试一个报表,必须要当天的数据,可我昨天刚测过,数据还在库里,于是想偷个懒,手工修改时间字段为今天的日期,改了不到1分钟,发现表太多了,而且记录时间的字段每个表还不止一个,不如用程序来做。于是写了下面的这个存储过程,哈哈,好用
  1. /*
  2. *搜索数据库当前用户的所有表,查出所有含date和time名称,
  3. *并且是number(14)类型的字段的日期部分改为当前日期
  4. */
  5. declare
  6.   type tcur is ref cursor; --定义游标类型
  7.   columnsCur   tcur;       --定义表的字段游标
  8.   sTName       varchar(30);--存储表名
  9.   sCName       varchar(30);--存储字段名
  10.   nCurrentTime number(14); --存储当前日期
  11.   updstr       varchar(900);
  12. begin
  13.   --获取当前日期YYYYMMDD
  14.   select to_number(to_char(sysdate, 'YYYYMMDD') || '000000')
  15.     into nCurrentTime
  16.     from dual;

  17.   --从oracle系统表获取包含数字日期形式的字段名和对应的表名
  18.   OPEN columnsCur for
  19.     select p.TABLE_NAME, p.COLUMN_NAME
  20.       from user_tab_columns p
  21.      where p.TABLE_NAME IN ('OPENORDER',
  22.                             'ORDERINSTRUCTION',
  23.                             'INSTRUCTIONDETAIL',
  24.                             'INTELLIGENTORDER',
  25.                             'TRADINGRESULT')
  26.        and p.DATA_TYPE = 'NUMBER' and p.DATA_PRECISION=14
  27.        and (p.COLUMN_NAME like '%DATE%' or p.COLUMN_NAME like '%TIME%');

  28.   --根据获得的表名和字段名把目前的时间更新为当前日期,时间保持不变
  29.   loop
  30.     fetch columnsCur
  31.       into sTName, sCName;
  32.     exit when columnsCur%notfound;
  33.     begin
  34.       --执行更新
  35.       updstr := 'UPDATE ' || sTName || ' SET ' || sCName || '=' ||
  36.                 nCurrentTime || '+ to_number(nvl(substr(' || sCName ||
  37.                 ', 9), 0)) where ' || sCName || ' IS NOT NULL AND ' || sCName || '>0';
  38.       --debug
  39.       --dbms_output.put_line(updstr);
  40.       execute immediate updstr;
  41.     exception
  42.       --如果发生错误,打印出执行的sql
  43.       when others then
  44.         dbms_output.put_line('Error:' || updstr);
  45.     end;
  46.     end loop;
  47.   commit;
  48. end;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP