迭代shell脚本中的PL / SQL结果

问题描述 投票:1回答:1

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

这里的目标是使用curl为数据库结果中检索到的每个记录调用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 
shell sh
1个回答
0
投票

假设您的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调用。

© www.soinside.com 2019 - 2024. All rights reserved.