使用 sqlplud 时的 Unix 命令替换

使用 sqlplud 时的 Unix 命令替换

尝试从 unix shell 脚本调用 sql 文件。

执行Sql1.sh

#!/bin/sh
## steps to get the connection and form it.
result=`sqlplus -S ${connectURL} << EOF
SET PAGES 0 lines 800
@ /sql/testQuery.sql ${LOGFILE} 
EOF`

echo $result

上述脚本的输出(按预期工作,无异常)

前模数:0 后模数:16 无错误。

执行Sql2.sh {注意,起始空间保留在结果变量下方}

#!/bin/sh
result=`sqlplus -S ${dbConnect} << EOF
      SET PAGES 0 lines 800
      @ /sql/testQuery.sql ${LOGFILE};
      EOF`

echo $result

执行时ExecuteSql2.sh,输出如下所示:

ExecuteSql2.sh:第 147 行:警告:此处文档第 144 行由文件结尾分隔(需要“EOF”) MODULUS BEFORE:0 MODULUS AFTER:16 无错误。 SP2-0042:未知命令“EOF”- 行的其余部分被忽略。


使用,不知道何时使用 `` 内置命令替换空格会导致此问题。

这有什么具体原因吗?

测试查询.sql:

SET SERVEROUTPUT ON SIZE UNLIMITED
set heading off verify off feedback off echo off

SPOOL &1

declare
 modulus NUMBER := 0;
BEGIN
  DBMS_OUTPUT.PUT_LINE('MODULUS BEFORE: '||modulus);

select mod(100,21) into modulus from dual;

DBMS_OUTPUT.PUT_LINE('MODULUS AFTER: '||modulus);

end;
/

SET ECHO ON FEEDBACK ON
SHOW ERRORS
SPOOL OFF

答案1

根据文档3.6 重定向 - 3.6.6 此处文档

这种类型的重定向指示 shell 从当前源读取输入,直到一行仅包含单词 (没有尾随空格) 可见。到该点读取的所有行都将用作命令的标准输入(或文件描述符 n,如果指定了 n)。

这里文档的格式是:

[n]<<[-]word
        here-document delimiter
delimiter 

所以你的代码应该是

result=`sqlplus -S ${dbConnect} << EOF
      SET PAGES 0 lines 800
      @ /sql/testQuery.sql ${LOGFILE};
EOF
`

请注意,最后的“`”应该位于 EOF 下方,尽管我认为最好使用$()如下所示的符号

result=$(sqlplus -S ${dbConnect} << EOF
      SET PAGES 0 lines 800
      @ /sql/testQuery.sql ${LOGFILE};
EOF
)

相关内容