#!/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 예, 변수와 함수를 쉘에 직접로드했다고 가정하면 함수가 "연결됨"이라고 부를 수 있으며 SQLPlus 헤더, db- 서버 호스트 이름 및 모든 기존 크레디트를 즉시 출력합니다. AWK를 사용하여 호스트 이름 만 잘라냅니다. 스크립트를 실행하고 세션에 모든 것을로드하면 스크립트는 db 연결을 설정하는 것과 같이 멈추지 만 "Hello From :"을 인쇄하여 확인으로 입력 한 echo 문이 실패하기 때문에 실패합니다 (공백이 호스트 이름이됩니다). – misteralexander