Uruchom skrypt Oracle SQL i wyjdź z narzędzia sqlplus.exe za pomocą wiersza polecenia


114

Chciałbym uruchomić skrypt Oracle za pośrednictwem SQL Plus za pomocą wiersza polecenia systemu Windows. Skrypt nie zawiera polecenia „exit”, ale nadal chciałbym, aby SQL Plus zakończył pracę, zwracając kontrolę do wiersza poleceń po zakończeniu skryptu. Moim celem jest zrobienie tego bez modyfikowania skryptu. czy to możliwe?


Czy wykonujesz to za pomocą „sqlplus .... <nazwa skryptu” lub „sqlplus ... @ nazwa skryptu” ?? Znajduję różne zachowania w zależności od tego, co robisz na Uniksie.
runrig

Odpowiedzi:


140

Innym sposobem jest użycie tego polecenia w pliku wsadowym:

echo exit | sqlplus user/pass@connect @scriptname

1
Chłodny! Czy wiesz, jak „wyjście” zostaje dołączone do sesji sqlplus?

6
Polecenie sqlplus uruchamia skrypt, a następnie próbuje odczytać więcej poleceń ze standardowego wejścia. W przypadku tego potoku odczyt ze standardowego wejścia odczyta ciąg „exit” z polecenia echo, powodując zakończenie działania sqlplus.
Dave Costa

Doskonale - właśnie tego szukałem. Dzięki!
JoshL

4
Strzeż się, że ujawniasz swoje hasło do nazwy użytkownika za pomocą listy procesów w systemie Unix (ps -ef), ale jestem prawie pewien, że działa tak samo w systemie Windows
Robert Merkwürdigeliebe

3
stackoverflow.com/questions/1639704/... i dba.stackexchange.com/a/65064/16892 opisują niektóre sposoby, aby nie musieć używać hasła w wierszu poleceń ...
rogerdpack

13

Uważam, że jest to najlepsze rozwiązanie i działa w terminalu lub w skrypcie:

echo @scriptname | sqlplus username/password@connect

1
Chociaż może to technicznie odpowiedzieć na pytanie, jest to w zasadzie duplikat innych odpowiedzi i nie wnosi żadnej wartości. Pomoże to także innym, jeśli wyjaśnisz, co robią te polecenia. Dziękuję Ci!
Chris S

5
To działało dla mnie i uważam, że jest bardziej eleganckie niż najlepsza odpowiedź, ponieważ pozwala uniknąć „wyjścia”.
Bogdan Calmac

12

Zdając sobie sprawę, że problem może dotyczyć samego pliku sql, zdaj sobie sprawę, że sqlplus musi zostać poproszony o wyjście. Tak to robię:

wybierz * z podwójnego;

porzucić;
/

(Ukośnik jest ważny. Mówi sqlplusowi o wykonaniu statemet (s) powyżej).


Zauważ, że odpowiedź Dave'a Costa również działa: przesyłanie wyjścia (lub wyjścia) do polecenia sqlplus.

Dzięki za / trick, szukałem tych informacji!

2
Ukośnik oznacza wykonanie tego, co znajduje się w buforze SQL. Nie wykonuje wielu instrukcji i nie jest konieczne wykonywanie poleceń sterujących SQLPlus, takich jak „quit”. Jeśli wpiszesz „quit” <Enter> w interaktywnym monicie SQLPlus, natychmiast zakończy działanie.
Dave Costa

12

Najlepszym sposobem na ukrycie informacji i wyjść użytkownika jest:

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

exitjest dostarczany do wyjścia sqlplus, zmuszając go do wyjścia. -Spomija wszystkie dane wyjściowe serwera inne niż zapytanie SQL w skrypcie.


2
Jeśli używasz ssh, to wyjdź | zamiast wyjścia | aby nie zamknęła sesji ssh, jeśli plik zostanie później edytowany w celu wyjścia lub wyjścia z niego. Działa to, jeśli plik też nie zostanie znaleziony.
Karl Henselin,

6

Możesz to również zrobić w skrypcie powłoki.

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

Być może będziesz musiał uciec przed „;” z \.


3

Tak, jest to możliwe - wygeneruj skrypt otoki, który odpowiednio skonfiguruje SQLPlus, uwzględni twój skrypt (tj. @YourTargetScript.sql), A następnie zakończy działanie.

To powiedziawszy, w ogóle nie polecam tego podejścia - SQLPlus ma wiele gotowych do użycia programowego; pisząc w przeszłości skrypty powłoki, które korzystały z Oracle, zbudowałem wokół niego otokę Pythona (dodając bardziej rozsądne zachowanie związane z obsługą błędów, rozsądną separacją danych wyjściowych między stdout / stderr, natywną obsługą wyjścia CSV i innymi tego typu dodatkami) i działało dużo lepiej.


Z każdym innym programem zgodziłbym się z tobą. ALE okazało się, że SQLPlus dał mi użyteczny kontekst w złym zapytaniu, czego nie zrobiły inne środowiska (w moim przypadku Perl / DBI / DBD :: Oracle). Jeśli ostrożnie obchodzisz się z błędami, może to być warte bólu.

Ponadto, w zależności od tego, ile masz kontroli nad serwerem, możesz, ale nie musisz, być w stanie założyć dostępność czegoś więcej niż powłoki i SQLPlus. Wiele sklepów z uniksowymi systemami operacyjnymi Solaris, HP / UX, AIX i podobnych korzysta z bardzo prostych instalacji i nie pozwala instalować niczego innego na urządzeniu. Pamiętaj, że czasami obejściem tego problemu jest po prostu dołączenie minimalnego interpretera do aplikacji.
ConcernedOfTunbridgeWells

3

Lubię to:

sqlplus / nolog userid / password @ tnsname @filename

Jeśli umieścisz to w pliku wsadowym, kontrola będzie kontynuowana z następującymi po nim instrukcjami.

EDYCJA: Mój zły, spróbuj ponownie z flagą / nolog


Niestety to nie działa. Kiedy wykonuję plik wsadowy, SqlPlus czeka na polecenie SQL> na dane wejściowe użytkownika, zamiast zwracać kontrolę w wierszu polecenia.
JoshL

Przepraszamy, to też nie działa. / nolog pozwala na uruchomienie sqlplus bez logowania. Nie ma to nic wspólnego z wychodzeniem ze skryptu po jego zakończeniu.
JoshL

Hmm, zaczynam się zastanawiać nad różnicami środowiskowymi. Mam wiele skryptów nietoperzy, które używają sqlplus w ten sposób.

Chris, czy możesz podać działający przykład? Po prostu coś prostego, co uruchamia „wybierz * z podwójnego” lub coś ... Stworzyłem przykłady, aby wypróbować twoje sugestie, bezskutecznie. Pamiętaj, że jest to w systemie Windows.
JoshL

Josh, zobacz nową odpowiedź poniżej.


0

W skrypcie SQL dodaj EXIT. Oto przykład mojego pliku test.bat:

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

mój plik test.sql ma: wybierz * z podwójnego; wyjście


To dobrze, ale nie spełnia tego wymagania bez modyfikacji skryptu, aby zawierał instrukcję exit / quit. Chodzi o to, aby te skrypty mogły być uruchamiane przez DBA z SQL Plus, ale mogą być również uruchamiane z pliku wsadowego.
JoshL

0

wyjście | SQLPLUS / @ @

To jest właściwe rozwiązanie, próbowałem to działa

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.