无法从 BASH 脚本中建立 Oracle SQL 会话

Not able to establish Oracle SQL session from within a BASH script

#!/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 }')
    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 会话而不会出现问题。我可以像我希望的那样调用函数和所有内容 returns。当我 运行 从脚本中执行完全相同的操作时,出现超时错误... "Hello From" 为空白,这告诉我没有数据库连接。

我完全不明白为什么在脚本外部一切正常,但在脚本内部却超时。

感谢您的关注和帮助!

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

PORT="5678"

但后来你做了:

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

这会用在那里输入的任何内容覆盖您的 5678 值。该端口可能根本没有在数据库服务器上侦听,或者可能正在做其他事情,或者如果您没有输入值,则在您连接时它将默认为端口 1521。但无论哪种方式,连接都会失败,根据端口状态,可能会很快或很慢(例如,如果防火墙阻止它,可能会更慢)。

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

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

您可能还会发现将 -l 标志添加到 SQL*Plus 调用中很有用,这样如果由于某种原因连接失败,它就不会 re-prompt 获取凭据,在某些情况下,这会使脚本看起来挂起,直到您按回车键几次。


与问题没有直接关系,但在自动执行此类操作时,我通常还使用 -s 标志来抑制横幅(可能因环境而异);如果您只对捕获查询输出感兴趣,我通常会关闭标题 and/or 分页和反馈,并且通常设置 SQL*Plus 以产生尽可能少的噪音 - 它使得更容易地解析出有趣的部分。