Oracle 将sqlplus值传递给shell变量

Oracle 将sqlplus值传递给shell变量,oracle,shell,powershell,sqlplus,Oracle,Shell,Powershell,Sqlplus,下图显示了在shell中运行sqlplus时返回的内容 但当我从“run”命令运行此命令时: voicetrigger2.ps1如下所示: $(sqlplus user/pass@OMP1 '@C:\sqltriggers\VOICEBLOCKTRIG.SQL'); 我明白了: 我希望能得到3分。问题是,我尝试将其设置为变量,如果整数大于零,则运行BAT文件。但我不认为SQLPlus返回的只是一个整数值。我认为它实际上返回了这个: count(*) 3 如何从SQLplus命

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

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

voicetrigger2.ps1如下所示:

$(sqlplus user/pass@OMP1 '@C:\sqltriggers\VOICEBLOCKTRIG.SQL');
我明白了:

我希望能得到3分。问题是,我尝试将其设置为变量,如果整数大于零,则运行BAT文件。但我不认为SQLPlus返回的只是一个整数值。我认为它实际上返回了这个:

count(*)
      3

如何从SQLplus命令返回整数值?

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

SQL*Plus没有返回任何内容,它在标准输出上显示查询结果。要获得仅显示
3
的直接调用,您可以
在SQL脚本中设置heading off
,还可以使用
-s
标记调用SQL*Plus以抑制标题。您可能还希望在SQL脚本的末尾有一个
退出
,这样它就不会停留在
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它没有返回任何内容。它没有执行查询。可能您在查询结束时缺少
/
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