#!/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”是空白的,这告诉我没有数据库连接。
我完全不知道为什么一切都从剧本外部发挥得很好,但内部却超时。
我很感激眼睛和帮助!
答案 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以产生尽可能少的噪声 - 这样可以更轻松地解析有趣的部分