不知何故,似乎 SQL*Plus(至少在 Windows 上)在使用相对路径调用@@
以及路径以单点或双点开头时无法找到具有相对路径的脚本。
例如,在x:\some\where
我有以下目录结构:
script.sql
main-dir\main-sub-dir
call-script.sql
script.sql
即:两个script.sql
但在不同的位置。
script.sql
刚刚下的内容x:\some\where
简直了
prompt SCRIPT root
而对方script.sql
的内容是
prompt SCRIPT main-dir/main-subdir
call-script.sql
读
@@script.sql
@ script.sql
预期产出
如果我从启动 SQL*Plusx:\some\where
然后执行
@main-dir/main-sub-dir/call-scripts
输出将是
SCRIPT main-dir/main-subdir
SCRIPT root
这是意料之中的,因为单曲@
应该搜索 SQL*Plus 启动@@
的路径,并且应该搜索包含脚本目录的路径。
意外输出
现在,如果我call-scripts.sql
这样改变:
@@./script.sql
@ ./script.sql
double@@
似乎改变了它的行为,因为它搜索 SQL*Plus 启动的路径,现在输出将是
SCRIPT root
SCRIPT root
这不是我所期望的。
这种行为是否记录在某处,更重要的是,我必须如何更改call-scripts.sql
才能正确调用相对路径(@@../../other-dir/other-sub-dir/script
)?
是的,这是已经存在很长时间的错误 2391334,并且可能在不久的将来不会修复。
解决此问题的一种方法是“知道”脚本的路径,而无需实际对该路径进行硬编码。在 SQLPlus 中执行此操作需要一个技巧 - 如果您尝试运行一个不存在的文件,那么您将收到一条包含路径名的错误消息。
所以这里有一个实际的演示。为了模仿你的场景,我有:
我们可以做的是在 call_script.sql 的前面添加一些命令来获取路径。它看起来有点奇怪,但您不需要更改它 - 它只是您粘贴的固定内容
这里发生了什么,我们正在运行一个不存在的脚本,它返回:
"SP2-0310: 无法打开文件 "path\_nonexistent_script.sql"
因此,使用一点正则表达式,我们可以提取路径,将其存储在 SQLPlus 变量中,然后从那时起使用。
所以你的 call_script.sql 的最终版本看起来像这样
当我们运行它时,我们得到以下信息
你去吧:-)