【问题标题】:Execute SQLPlus sql file in relative path in ShellScript在Shell脚本中的相对路径中执行SQLPlus sql文件
【发布时间】:2019-06-24 16:09:54
【问题描述】:

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

- 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; 

感谢您的帮助!

【问题讨论】:

    标签: sql shell sqlplus oracle-xe


    【解决方案1】:

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

    如果你 cd 进入 folderA/scripts/ 并运行 ./myShellScript.sh 将 SQL 文件称为 @../sql/mySql.sql 它应该可以正常工作。

    如果您将 myShellScript.shfolderA/ 调用为 ./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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 2019-01-27
      • 2012-05-12
      相关资源
      最近更新 更多