我在 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 脚本中使用此命令。
正确的格式是:
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
如果您想抑制终端输出,可以在 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 输出不会发送到您的终端(或日志文件,就像我的情况一样)。
您必须使用 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
取消设置
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