8

Linux で Oracle 11g を実行しており、データベースを作成するスクリプトを実行しようとしています。このスクリプトは Windows では問題なく動作しますが、Linux でテストすると、次のエラーが発生します。

SP2-0556: Invalid File Name

問題は、ファイル名へのパスにスペースが含まれている可能性があります。問題を単純化するために、ファイルで実行する多くのコマンドの 1 つにまで単純化します。実行しようとしているサンプル コマンドは次のようになります。

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

create_sequence.sql ファイルには、単独で正常に実行される 2 つの単純な create sequence コマンドがあります。ディレクトリ名を 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つに接続したところ、この問題を非常に簡単に再現できました。コマンドラインから「@」オプションを使用してファイルを実行する方法が見つからないようです。そのため、回避策として次のオプションが残っていると思います。

  1. My Schemaディレクトリの名前を変更して、スペースがなくなるようにします(また、それを参照する他のすべてのスクリプトを更新します)
  2. ファイルが存在するディレクトリからファイルを実行します(これが機能することを確認しました。以下を参照してください)。
  3. stdinを介してファイルをsqlplusに送信します(以下を参照)

また、Oracleサポートが提供できる簡単な修正がある可能性があるため、Oracleサポートにレポートを提出する必要があります。

コマンドの例:

ディレクトリから

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

stdin経由

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の問題があるようです:「スペースを含むファイル名を持つバグ7150873SQLスクリプトはSP2-0556になります」。10.2.0.4および11.1に影響を与えるものとしてリストされています。おそらく10.2.0.5と11.2で修正されていますが、どちらもまだ利用できません。それはほとんど/すべてのプラットフォームに影響を与える一般的な問題であると言っているので、これがあなたの問題であるかどうかはわかりません。

問題の具体的なテキスト:「SQLPLUSSTARTコマンドは、ファイル名にスペースが含まれている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呼び出しをラップする必要があります。もう1つのオプションは、たとえば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 の改行文字を処理する方法を認識していない可能性があります。既存のファイルを削除して、目的のコマンドで再作成してみてください (DDL コマンドは 2 つしかないので、簡単なはずです)。

于 2009-07-28T22:30:40.433 に答える
0

空白をエスケープしようとしましたか?

試す:

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

私はそれが古い質問であることを知っていますが、私は同じ状況に遭遇したばかりで、多くの試みの後、私はそれを機能させ、私の解決策を共有したいと思いました.

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

于 2016-01-22T23:09:29.787 に答える
0

Linux でこれを使用している場合は、次のように「\」文字でスペースをエスケープできます。

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