Вопрос: Запустите Oracle SQL-скрипт и выйдите из sqlplus.exe через командную строку


Я хотел бы запустить скрипт Oracle через SQL Plus с помощью командной строки Windows. Сценарий не содержит команду «exit», но мне все равно хотелось бы, чтобы SQL Plus завершил работу, возвращая управление командной строке при завершении сценария. Моя цель - сделать это без изменение скрипта. Это возможно?


98
2017-09-22 23:33


Источник


Выполняете ли вы это с помощью «sqlplus .... <scriptname» или «sqlplus ... @scriptname»? Я нахожу разное поведение, в зависимости от того, что вы делаете в Unix. - runrig


Ответы:


Другой способ - использовать эту команду в пакетном файле:

echo exit | sqlplus user/pass@connect @scriptname

126
2017-09-23 12:28



Круто! знаете ли вы, как «выход» добавляется в сеанс sqlplus?
Команда sqlplus запускает скрипт, затем пытается прочитать больше команд со стандартного ввода. С помощью этого конвейера чтение со стандартного ввода будет считывать строку «exit» из команды echo, вызывая выход sqlplus. - Dave Costa
Отлично - это именно то, что я искал. Благодаря! - JoshL
Помните, что вы открываете свой пароль пользователя в списке процессов в unix (ps -ef), но я почти уверен, что он работает так же в окнах - Robert Merkwürdigeliebe
stackoverflow.com/questions/1639704/... а также dba.stackexchange.com/a/65064/16892 описать некоторые способы не использовать пароль в командной строке ... - rogerdpack


Я нашел, что это лучшее решение, и оно работает в терминале или внутри скрипта:

echo @scriptname | sqlplus username/password@connect

12
2017-10-26 12:21



Хотя это может технически ответить на вопрос, это, по сути, дубликат других ответов и добавляет мало значения. Кроме того, это поможет другим, если вы объясните, что делают эти команды. Спасибо! - Chris S
Это сработало для меня, и я считаю его более элегантным, чем лучший ответ, потому что он избегает «выхода». - Bogdan Calmac


Лучший способ скрыть информацию пользователя и выходы:

exit | sqlplus -S user/pwd@server @script.sql

exit поставляется на выходе sqlplus, заставляя его выйти. -S suprresses весь вывод сервера другой, а затем sql-запрос в скрипте.


12
2018-03-18 21:20



Если вы используете ssh, выполните команду quit | вместо выхода | так что он не закрывает ваш сеанс ssh, если файл впоследствии отредактирован, чтобы иметь выход или выйти из него. Это работает, если файл также не найден. - Karl Henselin


Понимая теперь, что ваша проблема может быть с самим файлом sql, поймите, что sqlplus нужно будет сказать, чтобы выйти. То, как я это делаю:

выберите * from dual;

уволиться;
/

(Слэш очень важен, он говорит sqlplus, чтобы выполнить statemet (ы) над ним.)


11
2017-09-23 16:04



Обратите внимание, что ответ Дейва Коста также работает: выход из системы (или выход) в команду sqlplus.
Спасибо за / трюк, я искал эту информацию!
Слэш означает выполнение того, что находится в буфере SQL. Он не выполняет несколько операторов, и нет необходимости выполнять команды управления SQLPlus, такие как «quit». Если вы наберете «quit» <Enter> в интерактивном приглашении SQLPlus, он немедленно выйдет. - Dave Costa


Вы также можете сделать это в своем сценарии оболочки.

sqlplus /nolog <<EOF
connect user/pass
@run_some_file.sql
select * from dual;
EOF

Возможно, вам нужно будет избежать ";" с \.


6
2017-09-23 12:33





Как это:

sqlplus / nolog userid / password @ tnsname @filename

Если вы поместите это в пакетный файл, управление будет продолжено с последующими инструкциями.

EDIT: Мой плохой, повторите попытку с флагом / nolog


4
2017-09-22 23:43



К сожалению, это не работает. Когда я запускаю командный файл, SqlPlus ждет приглашение SQL> для ввода пользователя вместо возврата в командную строку. - JoshL
Извините, это тоже не работает. / nolog позволяет запустить sqlplus без входа в систему. Это не имеет никакого отношения к завершению работы скрипта. - JoshL
Хм, я начинаю задаваться вопросом о различиях в окружающей среде. У меня есть многочисленные скрипты bat, которые используют sqlplus таким образом.
Крис, не могли бы вы привести рабочий пример? Просто что-то простое, которое запускает «select * from dual» или что-то еще ... Я создал примеры, чтобы опробовать ваши предложения, но безрезультатно. Помните, что это в Windows. - JoshL
Джош, см. Новый ответ ниже.


Да, возможно - сгенерируйте сценарий оболочки, который соответствующим образом устанавливает SQLPlus, включает ваш скрипт (т.е. @YourTargetScript.sql), а затем выход.

Тем не менее, я не рекомендую этот подход вообще - SQLPlus имеет очень много исправлений для программного использования; при написании сценариев оболочки в прошлом, которые использовали Oracle, я построил вокруг него оболочку Python (добавив более разумное поведение обработки ошибок, разумное разделение вывода между stdout / stderr, встроенной поддержкой вывода CSV и другими подобными лакомствами), и это сработало намного лучше.


3
2017-09-22 23:40



С любой другой программой я бы согласился с вами. НО я обнаружил, что SQLPlus дал мне полезный контекст по плохому запросу, который в других средах (в моем случае Perl / DBI / DBD :: Oracle) этого не сделал. Если вы делаете тщательную обработку ошибок, это может стоить боли.
Кроме того, в зависимости от того, сколько контроля у вас есть над сервером, вы можете или не иметь возможности предполагать наличие чего-либо большего, чем shell и SQLPlus. Множество опытных магазинов Unix под управлением Solaris, HP / UX, AIX и т. Д. Используют очень простые установки и не позволят вам устанавливать что-либо еще на коробке. Обратите внимание, что иногда обходным путем для этого является простое связывание минимального интерпретатора с вашим приложением. - ConcernedOfTunbridgeWells


Для тех, кто обеспокоен безопасностью включения вашего пароля в сценарий, у AskTom есть статья о «идентифицированном извне», http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:142212348066


1
2017-07-16 19:38



Хотя это теоретически может ответить на вопрос, было бы предпочтительнее чтобы включить здесь основные части ответа и предоставить ссылку для справки. - Scott Pack


В SQL Script добавьте EXIT. Вот пример мой файл test.bat имеет следующее:

Пользователь sqlplus / pwd @ server @ test.SQL> myLOG.LOG

Мой файл test.sql имеет следующие значения: выберите * from dual; Выход


0
2018-06-19 20:40



Это нормально, но не соответствует требованию сделать это, не изменяя сценарий, чтобы включить оператор exit / quit. Цель состоит в том, что эти сценарии могут запускаться администратором баз данных из SQL Plus, но также могут запускаться из пакетного файла. - JoshL