这篇文章看起来有点简陋小白,但是如果你也遇到了这样的问题需求,仔细把它看完,对你一定有所帮助。 首次写shell脚本,语法很菜,希望大家指点跟进 我在这不多废话,开始
spool脚本
首先spool脚本常用命令:
spool C:\Users\AnYi\Desktop\ODS\a.dat
set colsep '@|@'
set echo off
set feedback on
set pagesize 0
set termout on
set trimspool on
set linesize 200
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脚本:
准备:
SPSQL_PATH="/home/odstest"
File_Path="/home/odstest/2022/"
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
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
sqlplus nane/pwd@11.11.111.123:1521/test <<EOF
@$SPSQL_PATH/spoolDept.sql
@$SPSQL_PATH/spoolBJ.sql
@$SPSQL_PATH/spoolBus.sql
exit
EOF
cd $File_Path
gzip -c $BUS > $BUS.gz
gzip -c $INTEGRATION > $INTEGRATION.gz
gzip -c $DEPT > $DEPT.gz
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
0 23 * * * /home/odstest/test.sh
service crond start
service crond restart
crontab -l
service crond stop
|