【问题标题】:Iterating through PL/SQL result in shell script遍历 PL/SQL 导致 shell 脚本
【发布时间】:2020-01-01 07:51:58
【问题描述】:

我是 shell 脚本的新手,因此需要帮助。我正在尝试对 Oracle DB 执行 sql 查询。收到 sql 查询结果后,我需要遍历结果(因为它将返回多行和多列。)。

这里的目标是使用 curl 为在 db 结果中检索到的每条记录调用 REST api。 REST api 的输入将是 ROOT_PROC_ID 列值。

以下是我目前开发的 shell 脚本和 sql 查询的示例输出。

#!/bin/bash
#Update below properties as per enviornment
export ENV=DEV;
export SERVERHOST=localhost
export SERVERPORT=9000
export SERVERUSER=admin
export SERVERPASSWORD=admin123
export DBHOST=localhost
export DBPORT=1537
export DBSID=ORCL
export DBUSER=SCOTT
export DBPASS=TIGER
export LOGDIR=/usr/app/$USER/data/logs/

#-------------------------------------------------------------------------
#----------- DO NOT EDIT AFTER THIS LINE ---------------------------------
#-------------------------------------------------------------------------

#create directory structure if not exists for storing log files
mkdir -p $LOGDIR/process_cancellation
mkdir -p $LOGDIR/process_cancellation/old
mkdir -p $LOGDIR/process_cancellation/halted
export old_proc_cancellation_logfile=$LOGDIR/process_cancellation/old/log_$(date "+%Y%m%d%H%M%S").log;
export halted_proc_cancellation_logfile=$LOGDIR/process_cancellation/halted/log_$(date "+%Y%m%d%H%M%S").log;

#execute sql query to fetch halted process data from database
echo
echo "Enviornment : $ENV"
echo
echo "Connecting to - $DBUSER/$DBPASS@$DBHOST:$DBPORT/$DBSID"
echo
echo "Retrieving halted process data logged before : $(date -d "15 days ago" +%d/%m/%Y) 20:00:00"
echo
sqlplus -s $DBUSER/$DBPASS@$DBHOST:$DBPORT/$DBSID << FIN_SQL > $halted_proc_cancellation_logfile
set head off
set line 1024
set pages 9999
SET SERVEROUTPUT ON;
SELECT  ROOT_PROC_ID, PROC_ID, PROC_NAME, START_DATE, STATUS, ORDER_REF 
FROM USER.PROC_STATUS
WHERE START_DATE<(SYSDATE - 15) AND (STATUS='proc_halted' OR STATUS='proc_failed')
ORDER BY START_DATE DESC;
SET SERVEROUTPUT OFF;
FIN_SQL

echo "Please check log file for more details : $(readlink -f $halted_proc_cancellation_logfile)"

exit

示例 SQL 查询输出:

ROOT_PROC_ID    PROC_ID         PROC_NAME               START_DATE                          STATUS      ORDER_REF
pvm:0a123akpd   pvm:0a123akkh   FunctionalErrorProcess  28-NOV-19 01.24.35.115000000 PM     pi_halted   2642277 
pvm:0a122utrn   pvm:0a122uun0   TechnicalErrorProcess   22-NOV-19 02.28.17.217000000 PM     pi_halted   2642278 
pvm:0a122utl2   pvm:0a122uu1t   TechnicalErrorProcess   22-NOV-19 02.27.54.024000000 PM     pi_halted   2642279 
pvm:0a122utln   pvm:0a122uu22   TechnicalErrorProcess   22-NOV-19 02.27.50.287000000 PM     pi_halted   2642280 

【问题讨论】:

  • 您到底想达到什么目标?问不清楚
  • this 是你要的吗?
  • @Guru - 更新了目标问题。在此处粘贴相同内容:“此处的目标是使用 curl 为 db 结果中检索到的每条记录调用 REST api。REST api 的输入将是 ROOT_PROC_ID 列值。”

标签: shell sh


【解决方案1】:

假设你的 sql 查询输出在 output.txt 中:

awk 'NR!=1' output.txt | while read rootprocid undef
do
   callApi $rootprocid
done

NR!=1 是跳过包含标题的第一行。

read rootprocid undef 只读取 rootprocid 中的第一列,其余的转到变量 undef,因为它不感兴趣。

callApi $rootprocid callAPI 将替换为您的实际 api 调用。

【讨论】:

  • 感谢大师。实际上,我正在尝试从 shell 脚本 var 本身读取 ROO_PROC_ID 以调用 REST api。成功调用 REST api 后,我计划将状态更改为“pi_cancelled”。最后,我计划使用 DB Result 创建 CSV 文件,其中理想状态列将具有“pi_cancelled”或“pi_halted”值。希望这有助于理解完整的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 2011-06-11
  • 2023-03-19
  • 2016-03-01
  • 2011-03-21
  • 1970-01-01
相关资源
最近更新 更多