尝试从 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
)