视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
批量更新表字段日期值的存储过程
2020-11-09 16:19:37 责编:小采
文档


今天由于测试一个报表,必须要当天的数据,可我昨天刚测过,数据还在库里,于是想偷个懒,手工修改时间字段为今天的日期,改了不到1分钟,发现表太多了,而且记录时间的字段每个表还不止一个,不如用程序来做。于是写了下面的这个存储过程,哈哈,好用 无 /*

今天由于测试一个报表,必须要当天的数据,可我昨天刚测过,数据还在库里,于是想偷个懒,手工修改时间字段为今天的日期,改了不到1分钟,发现表太多了,而且记录时间的字段每个表还不止一个,不如用程序来做。于是写了下面的这个存储过程,哈哈,好用 <无> $velocityCount-->
/*
 *搜索数据库当前用户的所有表,查出所有含date和time名称,
 *并且是number(14)类型的字段的日期部分改为当前日期
 */
declare
 type tcur is ref cursor; --定义游标类型
 columnsCur tcur; --定义表的字段游标
 sTName varchar(30);--存储表名
 sCName varchar(30);--存储字段名
 nCurrentTime number(14); --存储当前日期
 updstr varchar(900);
begin
 --获取当前日期YYYYMMDD
 select to_number(to_char(sysdate, 'YYYYMMDD') || '000000')
 into nCurrentTime
 from dual;

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

 --根据获得的表名和字段名把目前的时间更新为当前日期,时间保持不变
 loop
 fetch columnsCur
 into sTName, sCName;
 exit when columnsCur%notfound;
 begin
 --执行更新
 updstr := 'UPDATE ' || sTName || ' SET ' || sCName || '=' ||
 nCurrentTime || '+ to_number(nvl(substr(' || sCName ||
 ', 9), 0)) where ' || sCName || ' IS NOT NULL AND ' || sCName || '>0';
 --debug
 --dbms_output.put_line(updstr);
 execute immediate updstr;
 exception
 --如果发生错误,打印出执行的sql
 when others then
 dbms_output.put_line('Error:' || updstr);
 end;
 end loop;
 commit;
end;

下载本文
显示全文
专题