用于使用SQL Plus更新行的Shell脚本

时间:2013-10-09 19:27:09

标签: sql shell sqlplus ksh

好的,所以我有一个我正在尝试运行的脚本,它创建一个带有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进行了更新。我之前尝试过这样做但它没有用,但我想我这次做的不管怎样。感谢大家的意见!

3 个答案:

答案 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传输的代码,因此我更简单,只是做了上述操作。奇怪的是这个简单的代码不会提前工作。以前一定是忽视了一些事情。再次感谢大家对此进行调查!