#!/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キューとチャネルの設定を自動化するためのスクリプトがあります。私の問題は、このスクリプトの外では、スクリプトに見られる変数を入力すれば、シェルから直接問題なくSQLセッションを確立できます。私は機能を呼び出すことができ、私はそれが望むようにすべてが返されます。スクリプト内からまったく同じものを実行すると、タイムアウトエラーが発生します...「Hello From」は空白で、DB接続がないことを示します。BASHスクリプト内からOracle SQLセッションを確立できません。
なぜ私はそれがスクリプトの外側からすべてうまくいくのかが分かりませんが、その内部はタイムアウトします。
私は目と助けを感謝します!
接続部分は正常に動作しているようです。あなたは単にConnectedと呼ぶなら何を見ますか?タイムアウトエラーはどこで確認できますか? (接続しても、あなたのawkパターンは私のために何も表示されないので、その周りにデバッグをしたいかもしれません) –
この行の$記号をエスケープする必要はありません:select pd.destination from $ {DB_SCHEMA} .pd_notification pd pd.org_id = '$ ORGID'; – BobC
@AlexPooleはい、変数と関数をシェルに直接ロードしたと仮定すると、関数 "Connected"を呼び出すことができ、SQLPlusヘッダー、db-serverホスト名、およびすべての既存のクレジットを即座に出力します。私はAWKを使ってそれをホスト名だけに整えます。スクリプトを実行してセッションにすべてをロードすると、スクリプトはDB接続を確立しようとするようにフリーズしますが、「Hello From:」という空白を印刷するとエラーが表示されないため、失敗しますホスト名は)。 – misteralexander