2009-10-28 14 views
39

È possibile fare qualcosa di simile?statement sqlplus dalla riga di comando

$ sqlplus -s user/pass "select 1 from dual" o
$ echo "select 1 from dual" | sqlplus -s user/pass

so che posso mettere select 1 from dual in un file e fare questo:
$ sqlplus -s user/pass @myFile.sql

ma mi chiedo se sia effettivamente necessario per creare un file solo per soddisfare sqlplus

+1

Possibile duplicato - http://stackoverflow.com/questions/638705/how-can-i-issue-a-single-command-from-the-command-line-through-sql-plus – vapcguy

risposta

45

Tieni presente che su Unix/Linux il tuo nome utente/password possono essere visualizzati da chiunque possa eseguire il comando "ps -ef" se lo si posiziona direttamente sulla riga di comando. Potrebbe essere un grosso problema di sicurezza (o trasformarsi in un grosso problema di sicurezza).

In genere consiglio di creare un file o di utilizzare il documento qui, in modo da poter proteggere il nome utente/password dal comando "ps -ef" in Unix/Linux. Se il nome utente/password sono contenuti in un file di script o in un file sql, è possibile proteggerli utilizzando le autorizzazioni di lettura utente/gruppo appropriate. Poi si può mantenere l'utente/passaggio in profondità il file come questo in uno script di shell:

sqlplus -s /nolog <<EOF 
connect user/pass 
select blah; 
quit 
EOF 
+0

non sempre true, a seconda della versione di Oracle e del sistema operativo, ma probabilmente un buon standard per seguire – dpbradley

+0

troppo cattivo heredoc's non sono facili in DOS http://stackoverflow.com/questions/1015163/heredoc- for-windows-batch – rogerdpack

+0

Ciò che mi meraviglia è il motivo per cui la leale riga di comando non viene semplicemente affrontata nel programma client SQL stesso, poiché sarebbe piuttosto banale da fare: nella funzione main(), copiare la riga di comando su una nuova variabile, e sovrascrivi il vecchio args/argv [], e nessuna riga di comando è visibile (o - solo per una frazione di un millisecondo forse) - perché oracle non implementa quella soluzione? –

6

Presumo che sia * nix?

Usa "here document":

sqlplus -s user/pass <<+EOF 
select 1 from dual; 
+EOF 

EDIT: ho dovuto cercare il tuo secondo esempio. Funziona, troppo (anche in Windows, sans zecche):

$ echo 'select 1 from dual;'|sqlplus -s user/pw 

     1 
---------- 
     1 


$ 
24

sono in grado di eseguire la query esatto facendo solo che ci sia un punto e virgola alla fine della mia dichiarazione prescelta. (L'uscita è effettiva, i parametri di collegamento sono stati rimossi.)

echo "seleziona 1 da doppio;" | sqlplus -s username/password @ host: 1521/servizio

  1 
---------- 
     1 

Non che sia dovrebbe avere importanza, ma sqlplus è in esecuzione su Mac OS X Snow Leopard e il server è Oracle 11g.

+0

+1, ma sappi che se stai facendo qualcosa di moderatamente complicato in SQL * Plus, di solito creerai alcune direttive SET e questo diventerà complicato se stai cercando di avere un comando a una riga. – dpbradley

+0

+1 Questo è uno strumento utile per eseguire rapidamente query semplici –

+0

+1 Infine, la risposta! Aggiunta del punto e virgola alla fine della query! In realtà è possibile eseguire sqlplus, accedere e quindi eseguire i comandi: non è necessario reindirizzare le credenziali. Il mio problema era che i comandi non erano in esecuzione - i numeri di riga continuavano a crescere! Ora so come farli funzionare - basta aggiungere un punto e virgola! Grazie! – vapcguy

20

La mia versione

$ sqlplus -s username/[email protected]:port/service <<< "select 1 from dual;" 


     1 
---------- 
     1 

EDIT:

Per multilinea è possibile utilizzare questo

$ echo -e "select 1 from dual; \n select 2 from dual;" | sqlplus -s username/[email protected]:port/service 


     1 
---------- 
     1 


     2 
---------- 
     2 
+0

I * davvero * come questo ma non sembra funzionare in tcsh – dldnh