Запустите сценарий Oracle SQL и выйдите из sqlplus.exe из командной строки.

114

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

JoshL
источник
Вы выполняете это с "sqlplus .... <scriptname" или "sqlplus ... @scriptname" ?? Я нахожу различные варианты поведения в зависимости от того, что вы делаете в Unix.
Runrig

Ответы:

140

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

echo exit | sqlplus user/pass@connect @scriptname
Дейв Коста
источник
1
Здорово! Знаете ли вы, как «выход» добавляется к сеансу sqlplus?
6
Команда sqlplus запускает скрипт, затем пытается прочитать больше команд из стандартного ввода. С этим конвейером чтение из стандартного ввода будет читать строку «exit» из команды echo, вызывая завершение sqlplus.
Дэйв Коста
Отлично - это именно то, что я искал. Спасибо!
JoshL
4
Остерегайтесь того, что вы выставляете свой логин-пароль через список процессов в Unix (ps -ef), но я почти уверен, что он работает так же и в Windows
Robert Merkwürdigeliebe
3
stackoverflow.com/questions/1639704/… и dba.stackexchange.com/a/65064/16892 описывают некоторые способы не использовать пароль в командной строке ...
rogerdpack
13

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

echo @scriptname | sqlplus username/password@connect
user142847
источник
1
Хотя это технически может ответить на вопрос, в сущности, это дубликат других ответов и мало что дает. Кроме того, это помогло бы другим, если бы вы объяснили, что делают эти команды. Спасибо!
Крис С
5
Это сработало для меня, и я нахожу это более элегантным, чем главный ответ, потому что это избегает «выхода».
Богдан Калмак
12

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

выберите * из двойного;

уволиться;
/

(Косая черта важна. Она указывает sqlplus выполнить метки состояния над ней.)

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

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

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

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

Гириш
источник
2
Если вы используете ssh - это выйти | вместо выхода | так что он не закроет ваш ssh-сеанс, если файл отредактирован позже, чтобы иметь выход или выход в нем. Это работает, если файл тоже не найден.
Карл Хенселин
6

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

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

Вам может понадобиться убежать от ";" с \.

Итан Пост
источник
3

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

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

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

Нравится:

sqlplus / nolog идентификатор пользователя / пароль @ tnsname @filename

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

РЕДАКТИРОВАТЬ: мой плохой, попробуйте еще раз с / Nolog флаг

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

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

user128494
источник
2
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
Скотт Пак
0

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

sqlplus user / pwd @ server @ test.SQL> myLOG.LOG

Мой файл test.sql имеет следующее: select * from dual; Выход


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

выход | SQLPLUS / @ @

Это правильное решение, я пытался это работает


источник