繁体   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