Oracle通过spool命令导出.dat数据,及通过Shell脚本定时任务执行卸数

这篇文章看起来有点简陋小白,但是如果你也遇到了这样的问题需求,仔细把它看完,对你一定有所帮助。
首次写shell脚本,语法很菜,希望大家指点跟进
我在这不多废话,开始

spool脚本

首先spool脚本常用命令:

spool C:\Users\AnYi\Desktop\ODS\a.dat--文件生成位置
set colsep '@|@'--输出分隔符(建议在sql中分隔:||'@|@'||如下:)
set echo off--显示命令
set feedback on--处理的记录条数
set pagesize 0--输出每页行数,缺省为24,为了避免分页,设定为0
set termout on--显示脚本中的命令的执行结果(控制台打印)
set trimspool on--除每行后面空格
set linesize 200--设置行宽,默认100
select NAME||'@|@'||CREATE_TIME||'@|@'||BUS_TYPE||'@|@'||STATUS||'@|@' from TableName;
spool off--结束
exit--退出

例:这是我的卸数spool脚本

准备:spoolBJ.sql

set echo off
set feedback off
set pagesize 0
set trimspool off
set termout off
set linesize 200
spool /home/odstest/2022/JRBJ_BS_INTEGRATION.dat--卸数地址,关联下面截图查看
SELECT NAME||'@|@'||STATUS||'@|@'||UNION_CODE||'@|@'||TO_CHAR(CREATE_TIME,'YYYY-MM-DD HH24:MI:SS')||'@|@' from JRBJ_BS_INTEGRATION;
spool off

我首次测试是这样子的:
在这里插入图片描述
执行

./test.sh spoolBJ.sql

在这里插入图片描述

导出成功,再通过shell实现更多要求

shell脚本:

准备:

#!/bin/bash

#spoolSql路径
SPSQL_PATH="/home/odstest"
#-- .dat/.ctl/.gz 文件生成存放路径
File_Path="/home/odstest/2022/"
#  .ctl / .gz 备份地址
bak_PATH="/home/odstest/odsbak"

BUS="JRBJ_BUS.dat"
INTEGRATION="JRBJ_BS_INTEGRATION.dat"
DEPT="JRBJ_DEPT.dat"


#备份
A=$(pwd)
cd $File_Path
for var in *.gz;do mv "$var" "$(date '+%Y%m%d')$var";done
for var in *.ctl;do mv "$var" "$(date '+%Y%m%d')$var";done
mv $(date '+%Y%m%d')* $bak_PATH
cd $A

#-----------------------------------------------开始导数,生成.dat文件
#卸数
export ORACLE_BASE=/data/app/oracle
export ORACLE_HOME=/data/app/oracle/product/11.2.0.4/db_1
export ORACLE_SID=test
export ORACLE_TERM=xterm
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export LANG=C
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
#以上代码为Oracle的系统环境变量设置,必须添加,否则crontab定时任务计划不能执行。
sqlplus nane/pwd@11.11.111.123:1521/test <<EOF
@$SPSQL_PATH/spoolDept.sql
@$SPSQL_PATH/spoolBJ.sql
@$SPSQL_PATH/spoolBus.sql

exit
EOF
#-----------------------------------------------导出.dat格式数据完成

#-- .dat/.ctl 文件存放路径
#File_Path="/home/odstest/2022/"

#-----------------------------打包文件
cd $File_Path
gzip -c $BUS > $BUS.gz
gzip -c $INTEGRATION > $INTEGRATION.gz
gzip -c $DEPT > $DEPT.gz

#-----------------------------以下是创建.dat对应的.ctl控制文件

DEPTctl="JRBJ_DEPT.ctl"
BUSctl="JRBJ_BUS.ctl"
INTEGRATIONctl="JRBJ_BS_INTEGRATION.ctl"



#-----部门控制文件检查
if [ -f "$DEPTctl" ]; then
  echo "$DEPTctl存在"
else
  touch $DEPTctl
  cat > $DEPTctl <<EO
DEPT_NAME@|@DEPT_CODE@|@DEPT_FULL_NAME@|@DEPT_UNI_CODE@|@DEPT_LEVEL@|@
@TABLE_NAME=JRBJ_DEPT
@SYS_NAME=YDYH
@DATA_DT=$(date +'%Y%m%d')
@LOAD_TIME=$(date +'%Y%m%d %H:%M:%S')
@ROW_COUNT=$(wc -l < JRBJ_DEPT.dat)
@LIST_SEP=@|@
@TGT_SYSTEM=ODS
@ADD_FLG=ADD
EO
fi

#-----业务流水控制文件检查
if [ -f "$BUSctl" ]; then
  echo "$BUSctl存在"
else
  touch $BUSctl
  cat > $BUSctl <<EO
NAME@|@DEPT_CODE@|@UNION_CODE@|@CREATE_BY@|@STATUS@|@BUS_TYPE@|@CARD_TYPE_ID@|@
@TABLE_NAME=JRBJ_BUS
@SYS_NAME=YDYH
@DATA_DT=$(date +'%Y%m%d')
@LOAD_TIME=$(date +'%Y%m%d %H:%M:%S')
@ROW_COUNT=$(wc -l < JRBJ_BUS.dat)
@LIST_SEP=@|@
@TGT_SYSTEM=ODS
@ADD_FLG=ADD
EO
fi

#-----背夹控制文件检查
if [ -f "$INTEGRATIONctl" ]; then
  echo "$INTEGRATIONctl存在"
else
  touch $INTEGRATIONctl
  cat > $INTEGRATIONctl <<EO
NAME@|@STATUS@|@UNION_CODE@|@CREATE_TIME@|@
@TABLE_NAME=JRBJ_BS_INTEGRATION
@SYS_NAME=YDYH
@DATA_DT=$(date +'%Y%m%d')
@LOAD_TIME=$(date +'%Y%m%d %H:%M:%S')
@ROW_COUNT=$(wc -l < JRBJ_BS_INTEGRATION.dat)
@LIST_SEP=@|@
@TGT_SYSTEM=ODS
@ADD_FLG=ADD
EO
fi

#--------------------------------------------------  结束

Linux测试主目录:
在这里插入图片描述

以下是准备卸数文件存放地址及备份文件地址
在这里插入图片描述
在这里插入图片描述

测试结果

执行./test.sh脚本后效果:
生成.dat数据.ctl控制文件,并且将.dat打包
在这里插入图片描述
这里进入odsbak备份目录,因为之前为空,没数据可备份
在这里插入图片描述
再次执行脚本,看到2022目录中导出了新文件(注意时间),并且odsbak目录中备份了上一波的文件。(上线肯定是使用crontab 定时器执行脚本的哈)
在这里插入图片描述

Linux创建crontab定时器任务:

crontab -e #修改定时任务配置
#进入i编辑,写入
0 23 * * * /home/odstest/test.sh #例:每天晚上11点执行

service crond start #启动定时任务
service crond restart #重启定时任务
crontab -l #查看定时任务列表
service crond stop #关闭定时任务
  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值