8

我在 Linux 上运行 Oracle 11g,我正在尝试运行一个脚本来创建我的数据库。该脚本在 Windows 上运行良好,但是当我在 Linux 上对其进行测试时,出现以下错误:

SP2-0556: Invalid File Name

问题可能是文件名的路径中有空格。我将把问题简化为我在文件中运行的许多命令之一,以使其简单。我尝试运行的示例命令如下所示:

sqlplus [uname]/[pw] @'../database/My Schema/create_sequence.sql'

create_sequence.sql 文件有两个简单的创建序列命令,它们可以自行运行良好。我强烈怀疑这是由于空白,因为当我将目录名称从 My Schema 更改为 MySchema 并相应地更改上面的 sqlplus 命令时,脚本运行良好。

就像我说的,这个脚本在带有空格的窗口中工作,但在 Linux 中却不行。我怀疑可能不支持空格,但我想知道是否有人知道有什么不同或者有解决方法吗?

旁注:运行如下命令:

more ../database/My\ Schema/create_sequence.sql

或者

more "../database/My Schema/create_sequence.sql" 

如您所料,将文件的内容打印到控制台。所以,我认为这是 sqlplus(和 linux)特定的。

4

7 回答 7

5

我连接到我的一个 Linux 机器,很容易重现这个问题。我似乎找不到任何方法可以从命令行使用“@”选项执行文件,所以我认为您可以使用以下选项来解决问题:

  1. 重命名My Schema目录,使其中不再有空格(以及更新引用它的所有其他脚本
  2. 从它所在的目录执行文件(我确认这有效,见下文)
  3. 通过标准输入将文件发送到 sqlplus(见下文)

您还应该向 Oracle 支持提交报告,因为他们可能会提供一个简单的修复。

示例命令:

从目录

cd ../database/My\ Schema
sqlplus [uname]/[pw] @create_sequence.sql

通过标准输入

sqlplus [uname]/[pw] < ../database/My\ Schema/create_sequence.sql
于 2009-07-28T23:04:57.713 回答
3

好吧,如果这是一个 Linux 问题(请参阅我对您的问题的评论 - 它在 Solaris 上运行良好),您可能需要尝试以下方式:

sqlplus [uname]/[pw] < '../database/My Schema/create_sequence.sql'

如果您尝试将参数传递给您的 sql 脚本,则会遇到问题,但是......

编辑:似乎有一个非常相似的问题引发了 Metalink 问题:“文件名包含空格的错误 7150873 SQL 脚本导致 SP2-0556”。它被列为影响 10.2.0.4 和 11.1。据说它已在 10.2.0.5 和 11.2 中修复,但两者均不可用。它确实说这是一个影响大多数/所有平台的通用问题,所以我不知道这是否是您的问题。

问题的具体文本:“SQLPLUS START 命令无法执行文件名中有空格的 SQL 脚本。”

只是为了笑,如果您执行以下操作会发生什么:

sqlplus [uname]/[pw]
start '../database/My Schema/create_sequence.sql'

EDIT2:我不知道批量修改脚本是否可行,但解决方法可能是:

cp '../database/My Schema/file2run.sql' ./temp.sql
sqlplus [uname]/[pw] @temp.sql
rm ./temp.sql

您需要以这种方式包装每个 sqlplus 调用。另一种选择是创建一个 shell 脚本,比如名称为 mysqlplus.sh:

#!/bin/sh
cp $2 ./temp$$
sqlplus $1 @$2
rm ./temp$$

然后修改你的构建脚本:

mysqlplus.sh [uname]/[pw] '../database/My Schema/create_sequence.sql'
于 2009-07-28T22:21:41.450 回答
1

根据OTN 站点上的这个线程,SP2-0556 可能是由正在执行的文件中的无效空白字符引起的。可能 Linux 版本的 SQL-Plus 不知道如何处理 Windows 换行符。尝试删除现有文件并使用您想要的命令重新创建它(您说只有 2 个 DDL 命令,所以应该很容易)。

于 2009-07-28T22:30:40.433 回答
1

如果你在路径周围加上引号,它会起作用:

SQL > START "C:\Documents and Settings\Administrator\demobuild.sql" 

不起作用

SQL > START C:\Documents and Settings\Administrator\demobuild.sql 
于 2013-05-04T06:08:50.533 回答
0

你试过逃避空白吗?

尝试:

sqlplus [uname]/[pw] @'../database/My\ Schema/create_sequence.sql'
于 2009-07-28T19:55:18.173 回答
0

如果您在 linux 下使用它,您可以使用 '\' 字符转义空格,如下所示:

sqlplus [uname]/[pw] @../database/My\ Schema/create_sequence.sql
于 2009-07-28T20:04:35.347 回答
0

我知道这是一个老问题,但我遇到了同样的情况,经过多次尝试,我成功了,我想分享我的解决方案,它只是把路径放在引号中,如下所示:

@"C:/Users/john/AppData/Roaming/SQL Developer/test.sql";

于 2016-01-22T23:09:29.787 回答