在ShellScript中的相对路径中执行SQLPlus sql文件

时间:2019-01-31 08:44:50

标签: sql shell sqlplus oracle-xe

我正在尝试创建一个ShellScript,该脚本将连接sqlplus并在子文件夹中执行file.sql。

- folderA/
 * scripts/myShellScript.sh
 * sql/mySql.sql

我想从myShellScript.sh执行mySql.sql。

我尝试过:

@../sql/mySql.sql

但是返回:找不到文件。

这是我的代码:

sqlplus -s $username/$password > logtest << EOF
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;

set echo on
set time off
set timing off
set heading off
set termout off
prompt ...
@../mySql.sql

SPOOL OFF
exit; 

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

@之后的路径是相对于调用路径myShellScript.sh的路径,而不是相对于路径myShellScript.sh所在的路径。

如果您将cd插入folderA/scripts/,并运行./myShellScript.sh并将SQL文件引用为@../sql/mySql.sql,那么它应该可以正常工作。

相反,如果您是从myShellScript.sh作为folderA/来调用./scripts/myShellScript.sh,则必须使用@./sql/mySql.sql

从任意位置调用myShellScript.sh的一种可能方法是在脚本中添加对当前目录的一些处理:

cd "${0%/*}"
sqlplus -s $username/$password > logtest << EOF
...
@../sql/mySql.sql

这样,sqlplusmyShellScript.sh所在的路径运行。
但是,当然,这也会改变logtest的写入路径。

实际上,我见过的最常见的方法是将所有路径都指定为绝对路径,并将其保存在变量中:

sqlpath=/path/to/sql/files
logpath=/path/to/logs

sqlplus USER/PASSWD >"$logpath"/logtest @"$sqlpath"/mySql.sql