我有一个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。