SQL * Plus @@在父脚本路径中包含空格的行为

时间:2016-01-18 15:07:54

标签: oracle sqlplus

我必须

  1. 连接
  2. 调用sql-script
  3. 退出sqlplus
  4. 所以,我已经创建了一个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)当然我在文件夹中有一些带有一些操作的.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

2 个答案:

答案 0 :(得分:1)

您可以拆分参数,以便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,因此无法在我的计算机上运行。

答案 1 :(得分:1)

感谢Alex Poole,答案在于文档

  

使用@@在另一个脚本中调用SQL脚本时出现SP2-0310错误,并且父脚本的路径包含空格(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
    

    所以,你必须在sqlplus之前更改目录,主机cd 不起作用。

    谢谢你们,伙计们。