静默模式下的sqlplus不是静默的

Posted

技术标签:

【中文标题】静默模式下的sqlplus不是静默的【英文标题】:Sqlplus in silent mode is not silent 【发布时间】: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 脚本中使用这个命令。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于静默模式下的sqlplus不是静默的的主要内容,如果未能解决你的问题,请参考以下文章

Sqlplus 参数

强制退出应用程序在后台模式下的静默通知

应用程序处于非活动状态时无法接收静默通知 iOS

SecureCRT远程连接Linux下的sqlplus中退格键不能使用之解决方法

Atitit 错误处理机制:静默模式警告模式 异常模式

微信公众号开发 - 静默授权获取用户信息