【问题标题】:Shell script to update row using SQL Plus使用 SQL Plus 更新行的 Shell 脚本
【发布时间】:2013-10-17 08:00:40
【问题描述】:

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

【问题讨论】:

  • 删除> /dev/null,以便您查看是否有任何错误消息。 $? 是否也设置为 0?祝你好运。
  • 我之前删除了 /dev/null 并且没有错误。 “更新周期成功”打印出来了,所以 $?设置为零@shellter
  • 很小的事情,但它可能会有所作为,echo "$UPDATE_SQL" >> ${WORK_AREA}/....?嘿,为什么 >> 只需要 > 。祝你好运。

标签: sql shell sqlplus ksh


【解决方案1】:

您在更新结束时和commit 之后缺少;。您可能应该添加类似的内容:

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

set line 之后获取不工作的日志。

【讨论】:

    【解决方案2】:

    我建议这样做。 (注意我在没有访问 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
    

    【讨论】:

      【解决方案3】:

      通过这段代码而不是以前的代码解决:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        • 2019-06-06
        • 2012-05-11
        • 1970-01-01
        相关资源
        最近更新 更多