2016-10-03 1 views
0

Когда я передаю имя для файла спула, я получаю неправильное имя файла. Например, я дважды нажимаю command.bat и в командной строке введите «TEST» (без кавычек) и нажмите enter. Скрипт запускает и запрашивает эту базу данных правильно, но мой выходной файл - «TESTcsv.LST» (опять же без кавычек). Если я изменю имя файла на правильный «TEST.csv», я вижу, что результат правильный.Передача имени файла спула SQL-скрипту в качестве параметра из командного файла - неожиданное поведение

command.bat:

@echo off 
SET /P name="Enter name: " 
sqlplus username/password @script.sql %name% 

script.sql:

--A whole bunch of formatting code 
... 
spool T:\&1.csv 
SELECT * FROM tablename WHERE somecol='&1'; 
spool off 
exit 

Кроме того, если я изменю sqlscript следующим образом:

spool T:\'&1'.csv 

Мой выходной файл становится 'TEST' .csv. Когда я оставляю одиночные кавычки, почему он удаляет '.' в имени файла спула и добавить «.LST»?

Обратите внимание, что параметр, передаваемый скрипту, также используется в запросе без каких-либо проблем.

Я также пробовал передавать аргументы с помощью утилиты sqlcmd, но мне не повезло, поэтому я бы хотел, чтобы это работало без sqlcmd, если это было возможно. На данный момент я могу переименовать файл, но это немного раздражает, когда приходится делать это каждый раз, когда мне нужно запустить скрипт.

+0

Если я редактирую команду катушки, чтобы быть 'золотник T: \ & 1..csv', я получаю правильный выходной файл. Если кто-нибудь скажет мне, почему второй «.» необходимо было бы оценить. Благодарю. –

+0

'&' - способ поместить две команды в одну строку. 'dir & set'. Это специальная команда. Закрытие в двойных кавычках или экранирование с помощью каретки. 'Скопируйте файл c: \ file^&. Txt' или' copy con 'и .txt ''. –

+0

@Noodles В этом случае '&' является частью SQL-скрипта, а не командной строки. Это просто первый аргумент, передаваемый SQL Script. Проблема заключается в том, что в SQL-запросе параметр отображается правильно, но в команде spool его нет. –

ответ

0

Нашел следующий ответ, который ответил на мой вопрос при поиске другой проблемы. Имена переменных должны быть завершены символом '.' для правильной конкатенации переменной и окружения. http://www.orafaq.com/node/515

Теперь, если я хочу, чтобы запрашивать имя пользователя, как Фред и установить подсказку к FredPrompt>? Просто начинка переменный не будет делать:

MyPrompt> set sqlp '&EnterNamePrompt> ' Enter value for enternameprompt: oops oops>

И ни волю конкатенации, так как SQL * Plus не принимает конкатенации для значений, переданных его команды SET:

oops> set sqlp '&EnterName' || 'Prompt> ' Enter value for entername: fred SP2-0158: unknown SET option "||" fred

Наконечник пользователя питания, который нужно запомнить здесь, состоит в том, что имена переменных могут быть завершены на определенный период. Просто заправьте период между именем переменным и последующим текстом:

SQL> set sqlp '&EnterName.Prompt> ' Enter value for entername: Fred FredPrompt>

Смежные вопросы