静默模式下的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 ... > /dev/null 2>&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.sq
l
并将这一行添加到 getCsv$sqlFile.sql 的开头(必须在任何 sql 命令之前)。
set termout off
【讨论】:
以上是关于静默模式下的sqlplus不是静默的的主要内容,如果未能解决你的问题,请参考以下文章