下图显示了我在shell中运行sqlplus时返回的内容
但是当我从“run”命令运行它时:
powershell.exe -noexit c:\sqltriggers\voicetrigger2.ps1
使用voicetrigger2.ps1:
$(sqlplus user/pass@OMP1 '@C:\sqltriggers\VOICEBLOCKTRIG.SQL');
我明白了:
我应该期待3回。问题是,我尝试将其设置为变量,如果整数大于零,则运行BAT文件。但我不认为SQLPlus返回JUST一个整数值。我认为它实际上归还了这个:
count(*)
3
如何从SQLplus命令返回整数值?
答案 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回答(查看第二个最佳投票答案)