使用crontab调度脚本时,Oracle SQLPlus spool命令无法正常工作?

时间:2016-10-25 15:32:14

标签: oracle bash sqlplus spool

我写了一个bash脚本,如下所示。当我在命令行上使用bash exec_proc_daily_20.sh运行脚本时,该脚本可以正常工作。作为spool $logfile命令的结果,内部记录成功创建了日志文件。

#!/bin/bash

year=`date +%Y`
month=`date +%m`
day=`date +%d`
prefixe=$month$day$year
logfile="/home/oracle/logs/exec_proc_daily_20_"$prefixe.log

sqlplus / "as sysdba" <<EOF >$logfile
spool on
spool $logfile
execute Proc_RFC_MAJ_MV_ITIN;
execute Proc_RFC_MAJ_MV_REFGEO;
commit;
quit
EOF

但是,当我使用crontab -e安排脚本时,如下所示:

* 4 * * * bash /home/oracle/scripts/exec_proc_daily_20.sh

创建了日志文件,但没有写入任何内容。为什么spool $logfile在这种情况下不起作用?

2 个答案:

答案 0 :(得分:3)

您可能希望将stderr重定向到stdout,或者将其捕获到另一个文件中:

sqlplus / "as sysdba" <<EOF >$logfile 2>&1

如果sqlplus报告错误,您可能没有看到它,因为您只是将stdout捕获到日志文件中。

答案 1 :(得分:0)

在这里阅读评论后,我解决了这个问题。我想在脚本中显式设置变量。以下是工作版本:

#!/bin/bash

year=`date +%Y`
month=`date +%m`
day=`date +%d`
prefixe=$month$day$year
logfile="/home/oracle/logs/exec_proc_daily_20_"$prefixe.log
export ORACLE_HOME=/u01/app/oracle/product/12.1.0.2/dbhome_2
export ORACLE_SID=IMSPROD1
export ORACLE_BIN=${ORACLE_HOME}/bin
export PATH=$PATH:${ORACLE_BIN}

sqlplus / "as sysdba" <<EOF >$logfile
spool on
spool $logfile
execute Proc_RFC_MAJ_MV_ITIN;
execute Proc_RFC_MAJ_MV_REFGEO;
commit;
quit
EOF

从上面的代码中可以看出,我添加了ORACLE_HOME,ORACLE_SID,ORACLE_BIN和PATH以使工作正常。