如何从Unix(bash)命令行调用使用@@运算符的SQLPlus脚本?

时间:2018-12-22 14:41:54

标签: sqlplus

我有一个SQL脚本A.sql,该脚本提供了另一个脚本B.sql,该脚本驻留在同一目录中(与A.sql相同)。

当前,B.sql的绝对路径是硬编码在A.sql中的;采购看起来像这样:

@/absolute/path/to/B.sql

只要我使用命令行从Unix shell(B.sql)调用A.sql,这就能很好地工作(即执行bash中的命令)

sqlplus -s /nolog < /absolute/path/to/A.sql

最后一个命令行中的路径不必是绝对的;相对路径也可以。这里重要的是,在该命令行中,sqlplus的输入来自stdin,如<重定向操作符所示。

我无法避免必须通过标准输入将A.sql的内容发送到sqlplus

更具体地说,如果我尝试运行此

sqlplus -s /nolog /absolute/path/to/A.sql

... sqlplus仅打印其帮助页面,提示我最后一个命令行格式错误。

问题是我想以此替换A.sql中来自B.sql的行

@@B.sql

...从而消除了硬编码路径。

根据documentation for the @@ operator,这将导致sqlplus在当前脚本(B.sql)所在的目录中查找A.sql,但格式为

sqlplus -s /nolog < /absolute/path/to/A.sql

sqlplus无法知道包含@@B.sql语句的脚本的位置;在这种情况下,所有sqlplus都知道它已经收到了stdin的一些输入。

实际上,当我在上面的代码行中运行时,这种期望就得到了证实;我得到了错误

SP2-0310: unable to open file "B.sql"

...(以及此错误下游的其他错误,原因是来源B.sql失败)。


在从@@命令行调用的脚本中使用bash运算符时,有什么方法可以使它工作?

FWIW,我使用的sqlplus的版本是11.2.0.4.0。

0 个答案:

没有答案