【问题标题】:Sqlplus in silent mode is not silent静默模式下的sqlplus不是静默的
【发布时间】:2014-11-20 16:12:05
【问题描述】:

我在 shell 脚本中使用 sqlplus,它可以工作(没有静默模式的 sqlplus),但我可以在终端中看到输出。我尝试在静默模式下使用不同的组合运行它,但它不起作用 -

sqlplus -s "$DBUSER/$DBPWD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=$DBHOST)(Port=$DBPORT))(CONNECT_DATA=(SID=$DBSID)))"  @$SCRHOME/getCsv$sqlFile.sql

它可以工作,但我可以在控制台上看到输出。我也试过了:

sqlplus \-s "....
sqlplus \-s \ "...
sqplus -S
sqlplus -s \ << EOF "...

我尝试删除双引号,但在这种情况下,即使 sqlplus 命令也不起作用。我在 shell 脚本中使用这个命令。

【问题讨论】:

    标签: oracle shell sqlplus


    【解决方案1】:

    正确的格式是:

    sqlplus -S LOGIN_INFO @SCRIPT_TO_RUN
    

    “静默”模式不会阻止终端输出。它所做的只是:

    -S             Sets silent mode which suppresses the display of
                   the SQL*Plus banner, prompts, and echoing of
                   commands.
    

    如果您想抑制所有终端输出,则需要执行以下操作:
    sqlplus ... &gt; /dev/null 2&gt;&amp;1

    【讨论】:

      【解决方案2】:

      如果您想抑制终端输出,可以通过在 SQLPlus 脚本中使用 spool 并将终端输出转移到 /dev/null 来实现。我是这样做的:

      首先是 SQLPlus:

      spool ${HOME}/output.dat;
      select
      ... <your query here> ...
      ;
      spool off;
      

      假设它被放置在文件$HOME/my.sql 中。这可以在 bash 脚本中调用,如下所示:

      echo "$(sqlplus -s /nolog << EOF
      CONNECT <your DB connnect string>
      whenever sqlerror exit sql.sqlcode;
      set echo off
      @${HOME}/my.sql
      exit;
      EOF) " > /dev/null
      

      查询的输出将被发送到${HOME}/output.dat,并且没有 SQLPlus 输出将发送到您的终端(或在我的情况下的日志文件)。

      【讨论】:

        【解决方案3】:

        你必须使用 set termout off

        应该是:

        sqlplus -S "$DBUSER/$DBPWD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=$DBHOST)(Port=$DBPORT))(CONNECT_DATA=(SID=$DBSID)))" @$SCRHOME/getCsv$sqlFile.sql

        并将这一行添加到 getCsv$sqlFile.sql 的开头(必须在任何 sql 命令之前)。

        set termout off
        

        【讨论】:

          猜你喜欢
          • 2014-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-10
          • 2013-08-27
          • 1970-01-01
          相关资源
          最近更新 更多