проблема с oracle sqlplus с пробелами в пути команды @
Я запускаю Oracle 11g в Linux, и я пытаюсь запустить скрипт, который создаст мою базу данных. Этот скрипт отлично работает в windows, но когда я тестирую его на Linux, я получаю следующую ошибку:
SP2-0556: Invalid File Name
проблема может быть в том, что путь к имени файла присутствует пробел. Я собираюсь упростить проблему до одной из многих команд, которые я запускаю в файле, чтобы сделать ее простой. Пример команды, которую я пытаюсь запустить, выглядит так:
sqlplus [uname]/[pw] @'../database/My Schema/create_sequence.sql'
в create_sequence.в sql-файле есть две простые команды create sequence, которые отлично работают сами по себе. Я сильно подозреваю, что это связано с пробелом, потому что, когда я изменяю имя каталога из моей схемы на MySchema и соответственно изменяю вышеуказанную команду sqlplus, скрипт работает нормально.
как я уже сказал, этот скрипт работает в windows с пробелами, но не в Linux. Я подозреваю, что пробелы могут не поддерживаться, но мне было интересно, знал ли кто-нибудь другой или есть работы вокруг?
Примечание: запуск команды вроде:
more ../database/My Schema/create_sequence.sql
или
more "../database/My Schema/create_sequence.sql"
выводит содержимое файла на консоль, как и следовало ожидать. Итак, я думаю, что это sqlplus (и linux).
7 ответов
я подключился к одному из моих ящиков Linux и смог довольно легко воспроизвести эту проблему. Кажется, нет никакого способа, которым я могу найти, чтобы выполнить файл с параметром " @ " из командной строки, поэтому я думаю, что у вас остались следующие параметры для работы:
- переименовать Мои Схемы каталог больше не имеет места в нем (а также обновление всех других скриптов, которые ссылаются на него
- выполнить файл из каталога, в которой он находится (я подтвердил, что это работает, см. ниже)
- отправить файл в sqlplus через stdin (см. ниже)
вы также должны подать отчет с поддержкой Oracle, поскольку может быть простое исправление, которое они могут предоставить.
Пример Команды:
Из Каталога
cd ../database/My\ Schema
sqlplus [uname]/[pw] @create_sequence.sql
через stdin
sqlplus [uname]/[pw] < ../database/My\ Schema/create_sequence.sql
Ну, если это проблема Linux (см. Мой комментарий к вашему вопросу - он отлично работает на Solaris), вам, возможно, придется попробовать что-то вроде:
sqlplus [uname]/[pw] < '../database/My Schema/create_sequence.sql'
однако вы сталкиваетесь с проблемами, если пытаетесь передать параметры в свой SQL-скрипт...
EDIT: кажется, проблема 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 таким образом. Другой вариант - создать сценарий оболочки, скажем, с именем mysqlplus.sh:
#!/bin/sh
cp ./temp$$
sqlplus @
rm ./temp$$
затем измените сценарии сборки следующим образом:
mysqlplus.sh [uname]/[pw] '../database/My Schema/create_sequence.sql'
Если вы ставите кавычки вокруг пути, это работает:
SQL > START "C:\Documents and Settings\Administrator\demobuild.sql"
Это не работы:
SQL > START C:\Documents and Settings\Administrator\demobuild.sql
по данным этой теме на сайте OTN SP2-0556 может быть вызвано недопустимыми пробелами в выполняемом файле. Вероятно, Linux-версия SQL-Plus не знает, как обращаться с символами новой строки Windows. Попробуйте удалить существующий файл и воссоздать его с помощью нужных команд (вы сказали, что есть только 2 команды DDL, поэтому это должно быть легко).
вы пытались избежать пробела?
попробуй:
sqlplus [uname]/[pw] @'../database/My\ Schema/create_sequence.sql'
Если вы работаете с этим под linux, вы можете избежать пространства с символом"\", таким как:
sqlplus [uname]/[pw] @../database/My\ Schema/create_sequence.sql
Я знаю, что это старый вопрос, но я просто столкнулся с той же ситуацией, и после многих попыток я заставил его работать, и я хочу поделиться своим решением, он просто поставил путь в кавычки, как это:
@"C:/Users/john/AppData/Roaming/SQL разработчик/тест.sql";