1

我正在从 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出现错误

4

1 回答 1

3

你说:

如果我从文件所在的文件夹中仅在 unix 中运行该文件(使用 SQL*Plus),它就可以正常工作。但是,如果我从不同的文件夹中运行相同的内容,则不会。

如果您从另一个文件夹运行 bash 脚本到您拥有 SQL 文件的位置,那么您如何期望 SQL*Plus 知道在哪里可以找到这些文件?问题不是“为什么看不见MyScript2.sql,而是为什么看见” MyScript1.sql。显而易见的答案是它看不到,或者至少看不到您认为它正在看到的文件版本。

SQL*Plus 文档中:

SQL*Plus 在当前目录中搜索 SQL 脚本,包括 login.sql,然后在 SQLPATH 指定的目录以及 SQLPATH 目录的子目录中搜索。

因此,如果您没有给出 SQL 文件的完整路径,它将在当前工作目录中搜索 - 当您执行 bash 脚本时,您所在的位置,而不是 bash 脚本所在的目录,即pwd显示的内容 - 和在$SQLPATH如果它被设置。

这表明您在其中一个地方有一份副本MyScript1.sql,或者可能是指向您的真实文件的软链接。如果我不得不猜测,我推测您最初编写MyScript.sql了与脚本相同的目录,然后在编写之前将其复制到另一个目录MyScript2.sql。无论如何,MyScript1.sql您正在运行的可能已经过时,或者将来可能会变得如此。

简短的回答是提供 SQL 文件的完整路径,或者作为@命令的一部分,或者在启动 SQL*Plus 之前在 bash 脚本中切换到该目录。

于 2013-04-18T09:10:14.733 回答