2016-09-22 94 views
0

我在編寫bash腳本時遇到了問題。從bash腳本中獲取sqlplus提示輸出

我想從sqlplus提示輸出到bash變量。我嘗試了許多論壇中建議的方法。

t=$(./bin/sqlplus 'oracleuser/[email protected](DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))' << END 
SELECT (1 - (Sum(getmisses)/(Sum(gets) + Sum(getmisses)))) * 100 FROM V\$rowcache; 
exit; 
END 
) 

echo $t 

這就是我想要做的。在上面,我正在生成字符串

'oracleuser/[email protected](DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))' 

動態。這部分工作正常,問題來了,當我通過命令

SELECT (1 - (Sum(getmisses)/(Sum(gets) + Sum(getmisses)))) * 100 FROM V\$rowcache; 

在sqlplus提示。這裏發生的事情就是,$符號正在越獄,但是當*命令作爲一個整體運行時,*符號會導致問題(如在sqlprompt中列出它運行的目錄中的所有文件!)。

我已經編寫這樣的: -

connect="'oracleuser/[email protected](DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))'" 

arr[1]="SELECT (1 - (Sum(getmisses)/(Sum(gets) + Sum(getmisses)))) * 100 FROM V\$rowcache;" 

exp=$(./bin/sqlplus $mconnect << END 
printf "${arr[1]}"; 
exit; 
END 
) 

echo $exp 

運行腳本時,它成功地進入到在sqlplus,但運行SELECT命令時,*引起的問題,但是,如果我進入命令手動它的工作原理。

有沒有更好的方法存在?我不是一個bash怪胎:(。

我需要一些實實在在的幫助!

感謝您抽出時間來看看我的問題。

最好的問候, Bhuvanesh

回答

0

如何運行查詢爲單獨的query1.sql文件?

此外,如果您只希望結果(在這種情況下,(1 - (Sum(getmisses)/(Sum(gets)+ Sum(getmisses))))* 100)返回並且沒有頭信息,請使用sqlplus -S。

sqlplus -h 

-S設置其抑制的 SQL * Plus的橫幅顯示靜音模式,提示和 命令呼應。

bash.sh:

#/bin/bash 
    connect="'oracleuser/[email protected](DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))'" 

    exp=$(./bin/sqlplus -S $connect << END 
    @query1.sql 
    END 
    ) 

echo $exp 

QUERY1.SQL:

SET HEAD OFF 
SELECT count(*) from all_users; 
exit 

然後運行的例子..

./bash.sh 
36 
+0

您好,感謝您的答覆。這種方法可行,但我試圖實現一個腳本文件,其中參數被修改並且查詢被傳遞給sql會話。因此,對於查詢,我會將它作爲數組元素或值添加到變量中,以便在從同一腳本啓動sqlplus會話時調用它。 –