簡體   English   中英

將sqlplus值傳遞給shell變量

[英]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');

我明白了:

shell2

我應該期待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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM