【问题标题】:pass sqlplus value to shell variable将 sqlplus 值传递给 shell 变量
【发布时间】:2013-05-04 16:39:27
【问题描述】:

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

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

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

voicetrigger2.ps1 如下:

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

我明白了:

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

count(*)
      3

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

【问题讨论】:

  • 它没有返回任何东西。它没有执行查询。可能您在查询结束时缺少/

标签: oracle shell powershell sqlplus


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      这种方式是行不通的。正如 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>
      

      【讨论】:

        【解决方案4】:
        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-08
          • 2020-12-06
          • 1970-01-01
          • 2011-12-10
          • 1970-01-01
          • 2012-10-24
          • 2013-03-28
          • 2015-09-09
          相关资源
          最近更新 更多