4

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

外壳1

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

powershell.exe -noexit c:\sqltriggers\voicetrigger2.ps1

使用 voicetrigger2.ps1 如下:

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

我明白了:

外壳2

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

count(*)
      3

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

4

4 回答 4

1

SQL*Plus 不返回任何内容,它在标准输出上显示查询结果。要让直接调用仅在 SQL 脚本中显示3您可以set heading off,并且还调用带有标志的 SQL*Plus-s以抑制横幅。您可能还希望exit在 SQL 脚本的末尾添加一个,这样它就不会停留在SQL>提示符处。

这同样适用于 powershell 调用,但还有其他事情发生;the17是一个行号,这意味着它正在等待更多输入并且尚未执行 SQL 脚本中的命令,这表明没有终止;or的查询/,或者没有终止的 PL/SQL 块/。但是,如果它与您在第一个示例中运行的 SQL 完全相同,那么这有点奇怪,因为它们的行为应该相同。您应该将 SQL 脚本内容添加到问题中以查看可能有什么问题。

我能想到的唯一会改变这种行为的是,如果你有一个login.sql包含命令的set sqlterminator命令,但你必须login.sql从两个调用中获取不同的文件......如果 powershell 有自己的环境,这是合理的变量,也许。

于 2013-05-10T07:59:29.220 回答
0

它不会以这种方式工作。正如亚历克斯所提到的,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>
于 2013-05-10T08:31:39.680 回答
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
于 2014-10-02T17:09:15.547 回答
-1

尝试SET HEADING OFF在文件的开头添加。检查这个答案(检查第二好的投票答案)

于 2013-05-10T03:54:29.347 回答