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?

JoshL
źródło
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
Dave Costa
źródło
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
użytkownik142847
źródło
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).

Chris Noe
źródło
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.

girish
źródło
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 \.

Ethan Post
źródło
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.

Charles Duffy
źródło
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

Chris Noe
źródło
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


źródło
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


źródło