[英]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.