我正在从bash运行SQL脚本。其中一个脚本似乎运行正常,但另一个脚本失败。你能否告诉我这可能是什么原因?
#!/bin/bash
sqlplus -S user/password@database << EOF
whenever sqlerror exit sql.sqlcode;
set echo off
set heading off
@MyScript1
@MyScript2
exit;
EOF
错误:
SP2-0310: unable to open file "MyScript2.sql"
在Unix中,两者的访问级别为:
-rwxrwxrwx MyScript1.sql
-rwxrwxrwx MyScript2.sql
该错误确实表明它无法访问文件MyScript2.sql
。但我感到好奇的是它如何才能访问同一文件夹中存在的MyScript1.sql
,而不是MyScript2.sql
?
此外,如果我从文件所在的文件夹中使用unix(使用SQL * Plus)运行该文件,它可以正常工作。但是,如果我从不同的文件夹运行相同的,它不会。下面的例子将更好地解释
/Folder/having/the/files
MyScript1.sql
和MyScript2.sql
都运行良好
/Some/random/folder
MyScript1.sql
运行良好,但MyScript2.sql
错误
答案 0 :(得分:3)
你说:
如果我在unix(使用SQL * Plus)的文件夹中运行该文件 文件存在它工作正常。但是,如果我从a运行相同的 它没有不同的文件夹。
如果您将bash脚本从不同的文件夹运行到您拥有SQL文件的位置,那么您希望SQL * Plus如何知道在哪里找到它们?问题不是“为什么它不能看到MyScript2.sql
,而是为什么可以看到MyScript1.sql
。显而易见的答案是它不能,或者至少看不到你认为它所看到的文件的版本。
SQL * Plus在当前搜索SQL脚本,包括login.sql 目录然后在SQLPATH指定的目录中,并在 SQLPATH目录的子目录。
因此,如果您没有给出SQL文件的完整路径,它将在当前工作目录中搜索 - 执行bash脚本时所在的位置,而不是bash脚本所在的目录,即{ {1}}显示 - 如果已设置,则显示在pwd
。
这表明您在其中一个地方有$SQLPATH
的副本,或者可能是您真实文件的软链接。如果我不得不猜测,我推测你最初写了MyScript1.sql
与脚本相同的目录,然后在写MyScript.sql
之前将其复制到另一个目录。在任何情况下,您运行的MyScript2.sql
可能已过期,或将来可能会过时。
简短的回答是提供SQL文件的完整路径,作为MyScript1.sql
命令的一部分,或者在启动SQL * Plus之前更改为bash脚本中的该目录。