请帮助我解决我面临的以下问题。
我有一些现有的shell脚本,每天定期运行,将一些数据换成文本文件并发送到另一个系统。
现在我已对这些脚本进行了一些更改,并且过去需要花费6小时的假脱机,现在相同的时间超过8小时。
我已阅读" /"在脚本中通常执行以前的sql语句。 那么通过下面的代码,sql查询被调用两次?
我是新手,对不起如果我是天真的,任何与此相关的帮助都表示赞赏。
提前致谢。
#!/bin/ksh
ORACLE_HOME=/pprodi1/oracle/9.2.0; export ORACLE_HOME;
Script_Path=<path>
dt=`date '+%y%m%d%H%M'`
find $Script_Path/testing_spool* -mtime +3 | xargs rm -f { }
cd $Script_Path
sqlplus -s uname/pwd@db_name<<EOF1>/dev/null
set echo off
set head off
set pages 0
set feedback off
set pause off
set colsep " "
set verify off
set termout off
set linesize 3000
set trimspool on
spool $Script_Path/testing_spool.dat
SELECT column_name
FROM table_name
WHERE created_date > SYSDATE - 1
AND col1 = '126'
AND col2 = 'N'
AND col3 = 6;
spool off;
/
EOF1
cat testing_spool.dat > testing_spool_$dt.txt
答案 0 :(得分:0)
是的,你的查询将被执行两次,一次是在线轴处于活动状态时,然后在关闭后再次执行。
如您所述,/
executes whatever is currently in the SQL buffer仍会包含您的查询。 spool off
是客户端命令,不会影响SQL缓冲区。
如果您在第10行没有输出重定向>/dev/null
的情况下运行脚本,或者如果您期望大量输出,则重定向到文件,那么您将看到重复的查询结果。
顺便说一句,set termout off
在您的脚本中没有执行任何操作,因为您将其作为heredoc运行。如果您在脚本文件中包含这些语句并使用start
或@
运行该语句,则会抑制输出,但as the documentation says:
ECHO不会影响您以交互方式输入的命令的显示或从操作系统重定向到SQL * Plus。
您可以在shell脚本中创建一个.sql文件,运行该文件,然后将其删除。您可能看不到多少好处,但这意味着您不需要使用该重定向隐藏所有输出,这将使诊断失败变得更加困难。