好的,所以我有一个我正在尝试运行的脚本,它创建一个带有update语句的文件,并通过管道来执行sqlplus。我知道update语句是有效的,它创建发送到sqlplus的文件是正确的,因为我在SQL Plus中只运行了该代码。它只是在我执行脚本时不起作用。我的团队和我已经看过这个并试过了很多东西,但是却无法弄清楚为什么它似乎没有执行。任何帮助都会很棒。谢谢!
# Update Cycle DUE_DATE_TIME field to target run date
UPDATE_SQL="UPDATE CYCLE SET DUE_DATE_TIME = to_date('${TARGET_RUN_DATE}', 'YYYYMMDD') - 1"
echo $UPDATE_SQL >> ${WORK_AREA}/update_cycle_table_${PROCESS_ID}.sql
echo "${USER_NAME}@${DATABASE}
set line 200
start ${WORK_AREA}/update_cycle_table_${PROCESS_ID}.sql
commit
exit"|sqlplus -s > /dev/null
if [[ $? -eq 0 ]]
then
print "Updated Cycle successfully\n\n"
fi
好的,所以我通过使它更简单一点来解决问题,而不是仅仅将其写入文件并在SQLPlus中运行,我只是在管道中对SQLPlus进行了更新。我之前尝试过这样做但它没有用,但我想我这次做的不管怎样。感谢大家的意见!
答案 0 :(得分:1)
在更新结束时和;
之后,您错过了commit
。您可能应该添加以下内容:
spool ${WORK_AREA}/update_cycle_table_${PROCESS_ID}.log
在set line
之后获取无法正常工作的日志。
答案 1 :(得分:1)
我建议这样做。 (注意我在没有访问ksh的情况下输入了这个,所以你可能需要稍微使用代码才能使它工作)。我从来没有成为sqlplus管道的忠实粉丝。从sqlplus返回并不是很有用。返回仅指示sqlplus是否成功运行,而不是基础sql的任何错误情况。
sqlplus -s /nolog <<EOD >> ${sql_local_output_file}
connect ${connect_string}
@${WORK_AREA}/update_cycle_table_${PROCESS_ID}.sql
commit
EOD
if (!grep -q -e error ${sql_local_output_file}); then
print "Updated Cycle successfully\n\n"
else
cat ${sql_local_output_file}
fi
答案 2 :(得分:0)
由此代码而不是之前的代码解决:
#Update cycle table with user input TARGET RUN DATE
echo "${USER_NAME}@${DATABASE}
set feedback off
UPDATE CYCLE SET DUE_DATE_TIME = to_date('${TARGET_RUN_DATE}', 'YYYYMMDD') - 1;
exit"|sqlplus -s >/dev/null
if [[ $? -eq 0 ]]
then
print "Updated Cycle successfully\n\n"
fi
由于某些原因,它甚至没有达到通过SQLPlus传输的代码,因此我更简单,只是做了上述操作。奇怪的是这个简单的代码不会提前工作。以前一定是忽视了一些事情。再次感谢大家对此进行调查!