将sqlplus值传递给shell变量

时间:2013-05-10 03:30:55

标签: oracle shell powershell sqlplus

下图显示了我在shell中运行sqlplus时返回的内容

shell1

但是当我从“run”命令运行它时:

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命令返回整数值?

4 个答案:

答案 0 :(得分: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有自己的环境变量,这似乎是合理的。

答案 1 :(得分:0)

它不会以这种方式工作。正如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>

答案 2 :(得分: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

答案 3 :(得分:-1)

尝试在文件开头添加SET HEADING OFF。检查this回答(查看第二个最佳投票答案)