Teradata SQL如何循环替换current_date重跑近一年历史脚本
Teradata历史数据批量重跑实现方案
方案1:修正存储过程实现(数据库端原生执行)
你之前存储过程跑失败大概率是动态SQL拼接、日期变量传参的问题,可参考以下实现逻辑:
REPLACE PROCEDURE batch_run_history() BEGIN -- 声明变量:开始日期为一年前的日期,可按需调整 DECLARE run_dt DATE; DECLARE start_dt DATE DEFAULT CURRENT_DATE - 365; DECLARE end_dt DATE DEFAULT CURRENT_DATE - 1; -- 循环遍历每个日期 WHILE start_dt <= end_dt DO SET run_dt = start_dt; -- 拼接动态SQL,把原脚本里的current_date替换为当前循环的日期变量 EXECUTE IMMEDIATE ' With CTEa as ( select a, b, c from Xtable where dt = ''' || run_dt || ''' - 1) , CTEb as (select d, e from CTEa join Ytable on .... where ''' || run_dt || ''' between adate and bdate) insert into Ztable (select g, f from CTEb); '; -- 日期自增1天 SET start_dt = start_dt + 1; END WHILE; END; -- 调用存储过程 CALL batch_run_history();
注意:如果表名、字段名有特殊字符,拼接SQL时要额外处理转义,执行前可以先把动态SQL打印出来校验逻辑是否正确。
方案2:Shell + BTEQ调度(更推荐,调试门槛低)
如果存储过程权限不足、报错排查麻烦,可以用脚本在服务器端循环调度,更灵活:
步骤1:准备SQL模板文件run_daily.sql
把原脚本里的current_date替换为占位符${RUN_DATE}:
With CTEa as ( select a, b, c from Xtable where dt = date '${RUN_DATE}' - 1) , CTEb as (select d, e from CTEa join Ytable on .... where date '${RUN_DATE}' between adate and bdate) insert into Ztable (select g, f from CTEb); .IF ERRORCODE <> 0 THEN .QUIT 1; .QUIT 0;
步骤2:编写Shell调度脚本batch_run.sh
#!/bin/bash # 配置数据库连接信息 TD_USER="你的用户名" TD_PWD="你的密码" TD_HOST="数据库地址" # 配置日期范围 START_DATE=$(date -d "1 year ago" +%Y-%m-%d) END_DATE=$(date -d "yesterday" +%Y-%m-%d) # 循环遍历日期 CURRENT_DATE="$START_DATE" while [ "$CURRENT_DATE" != $(date -d "$END_DATE +1 day" +%Y-%m-%d) ]; do echo "正在执行日期:$CURRENT_DATE" # 替换SQL模板中的占位符 sed "s/\${RUN_DATE}/$CURRENT_DATE/g" run_daily.sql > temp_run.sql # 调用bteq执行SQL bteq << EOF .LOGON $TD_HOST/$TD_USER,$TD_PWD; .RUN FILE=temp_run.sql; .LOGOFF; EOF # 判断执行结果,失败就记录日志 if [ $? -ne 0 ]; then echo "日期$CURRENT_DATE执行失败,请检查" >> error.log # 可选:失败直接退出 去掉下行注释即可 # exit 1 fi # 日期加1天 CURRENT_DATE=$(date -d "$CURRENT_DATE +1 day" +%Y-%m-%d) done rm -f temp_run.sql
执行脚本
给脚本加执行权限后后台运行即可:
chmod +x batch_run.sh nohup ./batch_run.sh > run.log 2>&1 &
注意事项
- 执行前先备份Z表原有数据,避免逻辑错误导致数据污染
- 可以拆分批次执行,比如每次跑1个月的数据,避免长事务占用过多数据库资源
- 建议开启执行日志,出现报错可以直接定位到失败的日期,单独补跑即可
内容的提问来源于stack exchange,提问作者nhox17
相关产品推荐
相关产品推荐

