无法在BASH脚本

时间:2017-02-21 20:49:22

标签: sql bash sqlplus oracle12c

#!/bin/bash
#Oracle DB Info for NEXT
HOST="1.2.3.4"
PORT="5678"
SERVICE="MYDB"
DB_USER=$(whoami)
DB_PASS=$(base64 -d ~/.passwd)
DB_SCHEMA="my_db"

#Section for all of our functions.
function SQLConnection(){
sqlplus "$DB_USER"/"$DB_PASS"@"$HOST":"$PORT"/"$SERVICE"
}

function Connected(){
SQLConnection <<EOF
select sys_context('USERENV','SERVER_HOST') from dual;
EOF
}

function GetJMS(){
SQLConnection <<EOF
set echo on timing on lines 200 pages 100
select pd.destination from ${DB_SCHEMA}.pd_notification pd where pd.org_id = '$ORGID';
EOF
}
TODAY=$(date +"%A %B %d, %Y")
read -r -p $'\n\nWhat is the ORG ID? ' ORGID
read -r -p $'\n\nWhat is the REMOTE QUEUE MANAGER NAME? ' RQM
read -r -p $'\n\nWhat is the IP address of the REMOTE QUEUE MANAGER? ' CONN
read -r -p $'\n\nWhat is the PORT of the REMOTE QUEUE MANAGER? ' PORT
echo -en "* $(whoami)\n* $TODAY\n* MQ Setup $ORGID\n\nDEFINE +\n\tCHANNEL('$RQM.LQML') +\n\tCHLTYPE(SDR) +\n\tCONNAME('$CONN($PORT)') +\n\tXMITQ('BUF.2.$ORGID.XMQ')\n\tCHAUTH(TLS_RSA_WITH_AES_256_CBC_SHA256)\n\nDEFINE +\n\tCHANNEL('LQML.$RQM') +\n\tCHLTYPE(RCVR) +\n\tTRPTYPE(TCP)\n\nDEFINE +\n\tQLOCAL('$RQM') +\n\tTRIGDATA('LQML.$RQM') +\n\tINITQ('SYSTEM.CHANNEL.INITQ') +\n\tTRIGGER USAGE(XMITQ)\n\n" > ~/mqsetup.mqsc

CONNECTED=$(Connected | awk 'NR==16')
echo -en "\n\nHello From: $CONNECTED\n\n"

for JMSDESTINATION in $(GetJMS | awk 'NR>=16&&NR<=24{print $1}')
    do
        read -r -p $'\n\nWhich REMOTE QUEUE NAME matches with this ${JMSDESTINATION}?' RNAME
        QDESC=$(echo "$JMSDESTINATION" | tr '.' ' ' | tr '[[:upper:]]' '[[:lower:]]')
        echo -en "\n\nDEFINE +\n\tQR($JMSDESTINATION) +\n\t\tREPLACE DESCR('$ORGID $QDESC Queue') +\n\t\tREPLACE MAXDEPTH(5000) +\n\t\tXMITQ('BUF.2.$ORGID.XMQ') +\n\t\tRNAME('$RNAME') +\n\t\tRQMNAME('$RQM')" >> ~/mqsetup.mqsc
    done

这是我构建的脚本,希望自动化IBM MQ队列和通道的设置。我的问题是,在这个脚本之外,我可以直接从shell建立一个没有问题的SQL Session,前提是我输入了脚本中看到的变量。我可以调用函数,一切都会像我希望的那样返回。当我从脚本中运行完全相同的东西时,我得到超时错误......“Hello From”是空白的,这告诉我没有数据库连接。

我完全不知道为什么一切都从剧本外部发挥得很好,但内部却超时。

我很感激眼睛和帮助!

1 个答案:

答案 0 :(得分:1)

您正在覆盖变量值。你在脚本的顶部有这个:

read -r -p $'\n\nWhat is the PORT of the REMOTE QUEUE MANAGER? ' PORT

但稍后你会这样做:

Connected

用你输入的任何东西覆盖你的5678值。该端口可能根本没有在数据库服务器上侦听,或者可能正在执行其他操作,或者如果您没有输入值,则在连接时它将默认为端口1521。但无论哪种方式,连接都会失败,无论是快速还是慢速,具体取决于端口状态(例如,如果防火墙阻止它,可能会更慢)。

如果您通过在read电话之前添加RQ_PORT电话来测试连接(就像我最初那样),那么它似乎工作正常;但是读取后的连接不起作用,因为它尝试连接的端口值现在是错误的。

为两个变量使用不同的名称,例如第二个read - 在~/mqsetup.mqsc命令和随后创建的-l文件中。

您可能还发现将-s标志添加到SQL * Plus调用中很有用,这样如果连接由于某种原因失败,它将不会重新提示凭据,这在某些情况下可以使脚本似乎挂起,直到你输入几次。

与问题没有直接关系,但在自动执行此类操作时,我通常还会使用SELECT Loc.[PLACE-REF], Tenant.[TENANCY-REF], PChar.[ACCOUNT-CODE], MAX (PChar.[START-DATE]) AS "START-DATE", PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT] FROM dbo.[RE-TENANCY] AS TenanT LEFT OUTER JOIN dbo.[RE-TNCY-PLACE] AS TncyPlace ON TncyPlace.[TNCY-SYS-REF] = TenanT.[TNCY-SYS-REF] LEFT OUTER JOIN dbo.[IH-LOCATION] AS Loc ON Loc.[PLACE-REF] = TncyPlace.[PLACE-REF] LEFT OUTER JOIN dbo.[IH-PLACE-CHG] AS PChar ON Pchar.[PLACE-REF] = Loc.[PLACE-REF] WHERE ( (Pchar.[START-DATE] = '04/01/2016') OR (Pchar.[START-DATE] BETWEEN '11/01/2016' AND '03/31/2017') ) AND Tenant.[TNCY-STATUS] = 'CUR' AND PChar.[ACCOUNT-CODE] = 'MEALS' AND Loc.[PLACE-REF] = '166CHA010' GROUP BY Loc.[PLACE-REF], Tenant.[TENANCY-REF], PChar.[ACCOUNT-CODE], PChar.[NET-AMT] ORDER BY Loc.[PLACE-REF] 标记来抑制横幅(可能因环境而异);如果你只对捕获查询输出感兴趣,我通常会设置标题和/或分页,并提供反馈,并且通常设置SQL * Plus以产生尽可能少的噪声 - 这样可以更轻松地解析有趣的部分