SQL*加上父脚本路径中带有空格的@@行为

SQL*Plus @@ behaviour with spaces in the parent script path

我必须

  1. 连接
  2. 调用sql-脚本
  3. 退出sql加

所以,我创建了一个 sql-脚本 run.sql:

set def on
WHENEVER SQLERROR EXIT ROLLBACK
conn &2
@"&1";

exit;

例如,我在文件夹 "c:\folder with spaces\":

中有一些 sql-脚本

a) install.sql 内容:

prompt Hello
@@a.sql
@@b.sql

b) 当然我在文件夹中有 a.sql 和 b.sql 文件以及一些操作。

所以,我尝试 运行 我的脚本:

sqlplus /nolog @"Path_to_Run\run.sql" \"c:\folder with spaces\install.sql\" user/pass@server

我得到了一个输出:

Hello
SP2-0310: unable to open file "c:\folder.sql"

所以,可以打开install.sql,但是不能打开@@a.sql。他尝试 运行 这样的脚本:

@c:\folder with spaces\a.sql

但是我怎样才能在这里加引号呢?他应该 运行 文件夹 "c:\folder with spaces\".

中的脚本 a.sql

您可以拆分参数,以便 run.sql 包含

set def on
WHENEVER SQLERROR EXIT ROLLBACK
conn &2
host cd "@3"
@"&1";

exit;

并用

调用它
sqlplus /nolog @"Path_to_Run\run.sql" \"c:\folder with spaces\" install.sql user/pass@server

请注意,它可能需要一些调整,它在我的计算机上不起作用,因为 cygwin 弄乱了它自己的 cd。

感谢 Alex Poole,答案在文档中

SP2-0310 Error when Calling a SQL Script in Another Script using @@ and the Path to the Parent Script Contains Spaces (Doc ID 745780.1)

并且一共有三种解法:

  1. 使用 8dot3 表示法。例如。使用 PROGRA~1 而不是 "Program Files".

  2. 避免将 sql 脚本保存在文件夹名称中包含空格的路径上。

  3. cd 到包含脚本的目录,而不是在 SQL*Plus.

  4. 中调用脚本时提供完整路径

第一种方法在 Windows 7 中对我不起作用(在 Win7 中设置 8dot3 需要做很多工作)。我得到:

>cd c:\folder~1
The system cannot find the path specified.

第二种方法对我也不起作用,我无法操作这些文件夹。我必须按原样使用它们。

第三种方法工作正常(但方式与上一条消息不同):

cd "c:\folder with spaces"
sqlplus /nolog @c:\run\run.sql install.sql user/pass@server

所以,你必须先更改目录 sql另外,host cd 不起作用。

谢谢大家。