[英]pass sqlplus value to shell variable
下圖顯示了我在shell中運行sqlplus時返回的內容
但是當我從“運行”命令運行它時:
powershell.exe -noexit c:\sqltriggers\voicetrigger2.ps1
使用voicetrigger2.ps1如下:
$(sqlplus user/pass@OMP1 '@C:\sqltriggers\VOICEBLOCKTRIG.SQL');
我明白了:
我應該期待3回。 問題是,我嘗試將其設置為變量,如果整數大於零,則運行BAT文件。 但我不認為SQLPlus返回JUST一個整數值。 我認為它實際上歸還了這個:
count(*)
3
如何從SQLplus命令返回整數值?
SQL * Plus沒有返回任何內容,它在標准輸出上顯示查詢結果。 要直接調用show 3
,可以在SQL腳本中set heading off
,也可以使用-s
標志調用SQL * Plus來禁止set heading off
。 您可能還希望在SQL腳本的末尾exit
,以便它不會保持在SQL>
提示符下。
這同樣適用於powershell調用,但那里還有其他東西; 17
是一個行號,這意味着它正在等待更多的輸入並且沒有執行SQL腳本中的命令,這表明查詢沒有終止;
或/
,或沒有終止/
的PL / SQL塊。 但是,如果它與您在第一個示例中運行的SQL完全相同,那么它有點奇怪,因為它們應該表現相同。 您應該將SQL腳本內容添加到問題中以查看可能出錯的內容。
我唯一能想到的就是改變這種行為,如果你有一個包含set sqlterminator
命令的login.sql
,但是你必須從兩個調用中獲取不同的login.sql
文件...如果powershell有自己的環境變量,那么這似乎是合理的。
它不會這樣工作。 正如Alex所說,sqlplus不會將任何內容作為函數返回 - 它只會將您生成的任何輸出寫入標准輸出。
您可以在sqlplus中包含變量,但沒有簡單的方法將它們傳遞給主機環境。 我能想到的唯一方法是使用spool命令生成另一個批處理文件,該文件實際上會設置您的主機變量,然后按照您希望的方式在主機腳本中處理它們。
像這樣的東西:
16:30:20 SYSTEM@sandbox> get host.sql
1 SET VERIFY OFF TRIMSPOOL ON TERMOUT OFF HEADING OFF LINESIZE 4000 PAGES 0 FEEDBACK OFF timing off
2 spool s:\.tmp\host.ps1
3 select '$env:MY_VAR="'||dummy||'"' from dual;
4 spool off
5* exit
16:30:25 SYSTEM@sandbox> @host.sql
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
PS S:\.tmp> cat host.ps1
$env:MY_VAR="X"
PS S:\.tmp> .\host.ps1
PS S:\.tmp> $env:my_var
X
PS S:\.tmp>
sqlplus -s /nolog <<EOF > query_result.txt
set heading off feedback off pagesize 0 linesize 30000 trimout on ;
select 5 from dual;
exit;
EOF
for i in `cat query_result.txt `
do
exit $i
done
嘗試在文件的開頭添加SET HEADING OFF
。 檢查這個答案(檢查第二個最佳投票答案)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.