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

问题描述 投票:0回答:4

我在 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
4个回答
8
投票

正确的格式是:

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


1
投票

如果您想抑制终端输出,可以在 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 输出不会发送到您的终端(或日志文件,就像我的情况一样)。


1
投票

您必须使用 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

0
投票

取消设置

ORACLE_PATH
不执行login.sql的内容

then sqlplus -S , or sqlplus -s

[oracle]$ unset ORACLE_PATH
[oracle]$ OUTPUT=$( sqlplus -S / as sysdba <<EOF
> set heading OFF termout ON trimout ON feedback OFF
> set pagesize 0
> select sysdate from dual;
> exit;
> EOF
> )
[oracle]$ echo $OUTPUT
05/09/23
© www.soinside.com 2019 - 2024. All rights reserved.