Eseguire lo script Oracle SQL ed uscire da sqlplus.exe tramite prompt dei comandi


114

Vorrei eseguire uno script Oracle tramite SQL Plus tramite un prompt dei comandi di Windows. Lo script non contiene un comando "exit", ma vorrei comunque uscire da SQL Plus, restituendo il controllo al prompt dei comandi al termine dello script. Il mio obiettivo è farlo senza modificare la sceneggiatura. È possibile?


Lo stai eseguendo con "sqlplus .... <scriptname" o "sqlplus ... @scriptname" ?? Trovo comportamenti diversi a seconda di quello che fai su Unix.
runrig,

Risposte:


140

Un altro modo è utilizzare questo comando nel file batch:

echo exit | sqlplus user/pass@connect @scriptname

1
Freddo! sai come l '"uscita" viene aggiunta alla sessione sqlplus?

6
Il comando sqlplus esegue lo script quindi tenta di leggere più comandi dall'input standard. Con questa pipeline, la lettura dallo standard input leggerà la stringa "exit" dal comando echo, causando l'uscita di sqlplus.
Dave Costa,

Eccellente - questo è esattamente quello che stavo cercando. Grazie!
JoshL,

4
Fai attenzione a esporre la password del tuo nome utente tramite l'elenco dei processi su unix (ps -ef) ma sono quasi sicuro che funzioni allo stesso modo su Windows
Robert Merkwürdigeliebe

3
stackoverflow.com/questions/1639704/... e dba.stackexchange.com/a/65064/16892 descrivere alcuni modi per non dover usare la password sulla riga di comando ...
rogerdpack

13

Ho trovato che questa è la soluzione migliore e funziona in un terminale o all'interno di uno script:

echo @scriptname | sqlplus username/password@connect

1
Mentre questo può tecnicamente rispondere alla domanda, è sostanzialmente un duplicato di altre risposte e aggiunge poco valore. Inoltre, aiuterebbe gli altri se spiegassi cosa stanno facendo questi comandi. Grazie!
Chris S,

5
Questo ha funzionato per me e lo trovo più elegante della risposta migliore perché evita "l'uscita".
Bogdan Calmac,

12

Comprendendo ora che il tuo problema potrebbe riguardare il file sql stesso, renditi conto che è necessario dire a sqlplus di uscire. Il modo in cui lo faccio è:

seleziona * da doppio;

smettere;
/

(La barra è importante. Indica a sqlplus di eseguire lo stato / i sopra / i.)


Nota che anche la risposta di Dave Costa funziona: piping exit (o quit) nel comando sqlplus.

Grazie per il / trucco, stavo cercando queste informazioni!

2
La barra indica l'esecuzione di ciò che si trova nel buffer SQL. Non esegue più istruzioni e non è necessario eseguire comandi di controllo SQLPlus come "esci". Se si digita "esci" <Invio> a un prompt SQLPlus interattivo, verrà chiuso immediatamente.
Dave Costa,

12

Il modo migliore per nascondere le informazioni dell'utente ed uscire è:

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

exitviene fornito all'output di sqlplus costringendolo a chiudere. -Ssopprime tutto l'output del server diverso dalla query sql nello script.


2
Se si usa ssh è necessario chiudere | invece di uscire | in modo che non chiuda la sessione ssh se il file viene modificato in seguito per avere un'uscita o uscire da esso. Funziona se il file non viene trovato anche.
Karl Henselin,

6

Puoi anche farlo nel tuo script di shell.

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

Potrebbe essere necessario sfuggire al ";" con un \.


3

Sì, è possibile: generare uno script wrapper che imposta SQLPlus in modo appropriato, include lo script (ad es. @YourTargetScript.sql) E quindi esegue un'uscita.

Detto questo, non raccomando affatto questo approccio - SQLPlus ha molti trucchi per l'uso programmatico; durante la scrittura di script shell in passato che utilizzavano Oracle, ho creato un wrapper Python attorno ad esso (aggiungendo un comportamento più ragionevole nella gestione degli errori, una sana separazione dell'output tra stdout / stderr, supporto dell'output CSV nativo e altri vantaggi simili) e funzionava molto meglio.


Con qualsiasi altro programma sarei d'accordo con te. MA ho scoperto che SQLPlus mi ha dato un utile contesto su una cattiva query che altri ambienti (nel mio caso Perl / DBI / DBD :: Oracle) non hanno fatto. Se stai facendo un'attenta gestione degli errori, questo può valere la pena.

Inoltre, a seconda di quanto controllo hai sul server, potresti o non essere in grado di assumere la disponibilità di qualcosa di più della shell e di SQLPlus. Molti negozi unix più stogier che eseguono Solaris, HP / UX, AIX e simili usano installazioni molto spoglie e non ti permetteranno di installare nient'altro sulla scatola. Si noti che a volte una soluzione alternativa a questo è solo quella di raggruppare un interprete minimo con l'applicazione.
Preoccupato di

3

Come questo:

sqlplus / nolog userid / password @ tnsname @filename

Se lo metti in un file batch, il controllo continuerà con le istruzioni che lo seguono.

EDIT: Mio male, riprovare con / nolog flag


Sfortunatamente, questo non funziona. Quando eseguo il file batch, SqlPlus attende al prompt SQL> l'input dell'utente anziché restituire il controllo al prompt dei comandi.
JoshL,

Spiacente, neanche questo funziona. / nolog consente a sqlplus di avviarsi senza effettuare l'accesso. Non ha nulla a che fare con l'uscita da uno script al termine.
JoshL,

Hmm, sto iniziando a chiedermi delle differenze ambientali. Ho numerosi script di pipistrelli che usano sqlplus in questo modo.

Chris, potresti fornire un esempio funzionante? Solo qualcosa di semplice che esegue un "select * from dual" o qualcosa del genere ... Ho creato esempi per provare i tuoi suggerimenti, senza risultato. Ricorda che questo è su Windows.
JoshL,

Josh, vedi la nuova risposta qui sotto.


0

Nel tuo script SQL aggiungi EXIT. Ecco un esempio del mio file test.bat:

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

il mio file test.sql ha il seguente: selezionare * da doppio; Uscita


Va bene, ma non soddisfa i requisiti per farlo senza modificare lo script per includere un'istruzione exit / quit. L'intento è che questi script possono essere eseguiti da un DBA di SQL Plus, ma possono anche essere eseguiti da un file batch.
JoshL,

0

uscita | SQLPLUS / @ @

Questa è la soluzione corretta, ho provato che funziona

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.