"假脱机; /" ' /'的重要性发布假脱机

时间:2016-05-19 15:13:31

标签: sqlplus ksh

请帮助我解决我面临的以下问题。

我有一些现有的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

1 个答案:

答案 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文件,运行该文件,然后将其删除。您可能看不到多少好处,但这意味着您不需要使用该重定向隐藏所有输出,这将使诊断失败变得更加困难。