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


114

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


Ви виконуєте це за допомогою "sqlplus .... <ім'я сценарію" або "sqlplus ... @scriptname" ?? Я знаходжу різні способи поведінки залежно від того, яку з них ви робите в Unix.
runrig

Відповіді:


140

Інший спосіб - використовувати цю команду в пакетному файлі:

echo exit | sqlplus user/pass@connect @scriptname

1
Класно! чи знаєте ви, як "вихід" додається до сеансу sqlplus?

6
Команда sqlplus запускає скрипт, потім намагається прочитати більше команд зі стандартного вводу. У цьому конвеєрі зчитування зі стандартного вводу прочитає рядок "вихід" з команди echo, викликаючи вихід sqlplus.
Дейв Коста,

Відмінно - це саме те, що я шукав. Дякую!
JoshL

4
Остерігайтеся, що ви виставляєте пароль свого користувача через список процесів на unix (ps -ef), але я майже впевнений, що він працює так само, як у Windows
Роберт Merkwürdigeliebe

3
stackoverflow.com/questions/1639704 / ... і dba.stackexchange.com/a/65064/16892 описують деякі способи не повинен використовувати пароль в командному рядку ...
rogerdpack

13

Я вважав, що це найкраще рішення, і воно працює в терміналі або в рамках сценарію:

echo @scriptname | sqlplus username/password@connect

1
Хоча це технічно може відповісти на запитання, це суттєво копія інших відповідей і додає мало значення. Крім того, це допоможе іншим, якби ви пояснили, що роблять ці команди. Дякую!
Кріс С

5
Це працювало для мене, і я вважаю це більш елегантним, ніж головна відповідь, оскільки це дозволяє уникнути "виходу".
Богдан Кальмак

12

Зрозумівши тепер, що ваша проблема може бути з самим файлом sql, зрозумійте, що sqlplus потрібно сказати, щоб вийти. Я це роблю:

виберіть * з подвійного;

кинути;
/

(Косою рисою є важлива. Вона повідомляє sqlplus виконувати statemet (s) над нею.)


Зауважте, що відповідь Дейва Коста також працює: передача труб (вихід або вихід) в команду 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. Багато stogier unix-магазинів під керуванням Solaris, HP / UX, AIX і подібних подібних програм використовують дуже голі інсталяції і не дозволяють вам інше встановити на коробку. Зауважте, що іноді вирішення цього питання полягає лише в тому, щоб поєднати мінімальний перекладач зі своєю програмою.
Занепокоєний

3

Подобається це:

sqlplus / nolog userid / password @ tnsname @filename

Якщо ви помістите це у пакетний файл, контроль продовжуватиметься із заяв, що слідують за ним.

EDIT: Мій поганий, спробуйте ще раз із прапором / 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


2
Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Скотт Пак

0

У свій SQL Script додайте EXIT. Ось приклад мого файлу test.bat має таке:

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

мій файл test.sql має таке: виберіть * з подвійного; Вхід


Це добре, але не відповідає вимозі робити це без зміни сценарію, щоб він включав оператор вихід / вихід. Намір полягає в тому, що ці сценарії можуть бути запущені DBA від SQL Plus, але вони також можуть бути запущені з пакетного файлу.
JoshL

0

вихід | SQLPLUS / @ @

Це правильне рішення, я спробував це працює

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.