2013-05-10 61 views
4

下面的圖片顯示,當我在外殼通sqlplus的價值外殼變量

shell1

運行sqlplus的,但是當我運行這個從「運行」命令,得到什麼返回:

powershell.exe -noexit c:\sqltriggers\voicetrigger2.ps1 

與voicetrigger2.ps1爲:

$(sqlplus user/[email protected] '@C:\sqltriggers\VOICEBLOCKTRIG.SQL'); 

我得到這個:

shell2

我應該期待3回。問題是,我嘗試將其設置爲一個變量,如果整數大於零,則運行BAT文件。但我不認爲SQLPlus正在返回一個整數值。我認爲它實際上返回這個:

count(*) 
     3 

我怎麼才能得到它只返回從SQLplus命令的整數值?

+1

它不返回任何東西。它不執行查詢。可能你在查詢結束時缺少'/'。 – 2013-05-10 07:58:21

回答

-1

嘗試在文件的開頭添加SET HEADING OFF。檢查this答案(檢查第二好的投票答案)

1

SQL * Plus不是返回任何東西,它顯示在標準輸出查詢的結果。要直接調用只顯示3,您可以在SQL腳本中使用set heading off,並且還可以使用-s標誌調用SQL * Plus來抑制橫幅。您可能還希望SQL腳本末尾有一個exit,以便它不會停留在SQL>提示符處。

這同樣適用於powershell調用,但還有其他的東西在那裏; 17是一個行號,意味着它正在等待更多輸入並且未執行SQL腳本中的命令,這表示無終止查詢或/或無終止/的PL/SQL塊。但是,如果它與第一個示例中運行的SQL完全相同,那麼這有點奇怪,因爲它們應該表現相同。您應該將SQL腳本內容添加到問題中以查看可能出錯的內容。

我能想到的唯一的事情會改變這樣的行爲是如果你有一個login.sql包括set sqlterminator命令,但你必須從兩個電話拿起不同login.sql文件...這是也許,如果PowerShell有自己的環境變量,這是有道理的。

0

它不會以這種方式工作。正如Alex所說,sqlplus不會將任何東西作爲函數返回 - 它只會將您生成的任何輸出寫入標準輸出。

你可以在sqlplus中有變量,但是沒有簡單的方法將它們傳遞給主機環境。我能想到的唯一方法是使用spool命令來生成另一個批處理文件,它將實際設置您的主機變量,然後以您希望的方式在主機腳本中處理它們。

事情是這樣的:

16:30:20 [email protected]> 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 [email protected]> @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> 
0
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