2017-02-21 5 views
0
#!/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 세션을 설정할 수 없습니다.

나는 왜 모든 것이 스크립트 바깥에서 훌륭하게 작동하는지에 관해 완전히 혼란 스럽지만, 그 안에 시간이 있습니다.

나는 눈과 도움을 주셔서 감사합니다!

+1

연결 부분이 정상적으로 작동하는 것 같습니다. 그냥 Connected에 전화하면 뭘 볼 수 있니? 시간 초과 오류는 어디서 볼 수 있습니까? (연결이 있어도 awk 패턴이 나에게 아무 것도 표시하지 않으므로 그 주위에서 디버깅을 할 수 있습니다.) –

+0

이 줄에서 $ 기호를 이스케이프하지 않아도됩니다. select pd.destination from $ {DB_SCHEMA} .pd_notification pd 어디 pd.org_id = '$ ORGID'; – BobC

+0

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

답변

1

변수 값을 덮어 쓰는 중입니다. 당신은 스크립트의 상단이 있습니다

PORT="5678" 

하지만 나중에 당신이 수행

가 입력 한대로하여 5678 값을 덮어
read -r -p $'\n\nWhat is the PORT of the REMOTE QUEUE MANAGER? ' PORT 

. 이 포트는 DB 서버에서 전혀 수신하지 않거나 다른 작업을 수행하고 있거나 값을 입력하지 않으면 연결할 때 포트 1521로 기본 설정됩니다. 하지만 포트 상태에 따라 연결 속도가 느리거나 느려지는 경우 (예 : 방화벽이 방화벽을 차단하는 경우 속도가 느려질 수 있음).

read 호출 전에 Connected 호출을 추가하여 연결을 테스트하는 경우 (처음에했던 것처럼) 정상적으로 작동하는 것 같습니다. 하지만 연결하려고하는 포트 값이 잘못 되었기 때문에 읽기 이후의 연결이 작동하지 않습니다.

두 변수에 다른 이름을 사용하십시오 (예 : read 명령과 그 이후에 ~/mqsetup.mqsc 파일을 작성하면 두 번째 파일은 RQ_PORT입니다.

SQL * Plus 호출에 -l 플래그를 추가하면 어떤 이유로 연결이 실패하면 자격 증명을 다시 묻지 않아서 상황에 따라 스크립트가 다음과 같이 나타날 수 있습니다. 당신이 몇 번 들어올 때까지 기다려라.


문제에 직접적인 관련이 있지만, 이런 건을 자동화 할 때 나는 보통 또한 배너 (환경에 따라 다를 수 있음) 억제하기 -s 플래그를 사용하지 않습니다; 쿼리 출력을 캡처하는 데 관심이 있다면 일반적으로 표제 및/또는 페이지 매김을 해제하고 피드백을 해제하고 일반적으로 SQL * Plus를 가능한 한 작은 노이즈를 생성하도록 설정합니다. 이렇게하면 흥미로운 비트를 더 쉽게 파싱 할 수 있습니다 .

+0

이것은 정확하게 맞았습니다! 이런, 나는 그것을 바로 보았다고 믿을 수 없어! 그것을 잡아 주셔서 너무 고마워요. 또한, 옵션 "-S"와 "-L"에 대해서도 몰랐습니다 ... 그것들은 도움이 될 것입니다. 감사! – misteralexander