0

好的,所以我有一个我正在尝试运行的脚本,它创建一个带有更新语句的文件并将其通过管道传递给 sqlplus 以执行。我知道更新语句是有效的,它创建发送到 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 进行了更新。我之前尝试过这样做,但没有成功,但我想这次我所做的一切都奏效了。谢谢各位的意见!

4

3 回答 3

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
于 2013-10-10T03:10:50.907 回答
1

您在;更新结束时和commit. 您可能应该添加以下内容:

spool ${WORK_AREA}/update_cycle_table_${PROCESS_ID}.log 

之后set line得到什么不工作的日志。

于 2013-10-09T20:32:34.180 回答
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 中的代码,所以我让它变得更简单,只是做了上面的事情。奇怪的是,这个更简单的代码如何不能及早工作。之前一定是忽略了什么。再次感谢大家对此进行调查!

于 2013-10-10T13:40:27.313 回答