2011-02-10 36 views
6

Il mio requisito è quello di memorizzare il risultato di un'operazione sqlplus in una variabile nel mio script di shell. Ho bisogno il risultato della seguente operazione che è nel mio file .shCome memorizzare il risultato da SQLPlus in una variabile di shell

sqlplus 'user/pwd' @test.sql 

Ho già provato

testvar = 'sqlplus 'user/pwd' 
@test.sql' 

ma che non funziona.

EDIT ::

ho cambiato in

testvar=sqlplus foo/[email protected] @test.sql 

e dice

SQL*Plus:: not found [No such file or directory]

ho provato con

testvar=$(sqlplus foo/[email protected] 
@test.sql) 

e dà lo stesso errore. Quando provo senza l'assegnazione di variabili come qui di seguito

sqlplus foo/[email protected] @test.sql 

funziona benissimo

+0

In una shell di tipo Bourne (come bash), la sintassi non consente spazi attorno a '='. –

risposta

9

backticks assumere:

testvar=`sqlplus foo/bar @test.sql` 

o che dovrebbero essere di pugno nell'occhio sintattico:

testvar=$(sqlplus foo/bar @test.sql) 

È chiaramente sapere di prendere i giusti comandi sql * plus per limitare il superflu ous output, sì? :) e, naturalmente, attenzione al backticking che collassa lo spazio bianco dell'output.

+1

"il backticking comprime gli spazi bianchi dell'output" - non lo farà. Rimuove solo i newline finali. Inoltre, non c'è nulla di vecchio-scolastico nell'usare '$()', è piuttosto il contrario. –

+1

È il contrario: i backtick sono "old school". Lo spazio bianco non è perso in cessione. Si perde sull'output se la variabile non è quotata. –

+0

Sì, hai ragione su '$()' In realtà ho modificato in seguito per aggiungere l'altra opzione e ho dimenticato di cambiare idea. – Xailor

1

Mentre i comandi all'interno di $() vengono eseguiti in una sottoshell, assicurarsi di disporre di tutto ciò che è necessario per l'invocazione di sqlplus esportato. In questo momento, ovviamente, sei incappato nel problema PATH.

13

Prova a modificare:

testvar=`sqlplus -s foo/[email protected] <<EOF 
set pages 0 
set head off 
set feed off 
@test.sql 
exit 
EOF` 

-s interruttore si spegne tutte le informazioni di intestazione quando lanci sqlplus. Si desidera anche disattivare il feedback, le intestazioni e il pageize su 0. I am old school quindi utilizzo ancora i tick posteriori :)

+0

dovrebbe aggiungere verifica, in caso di passaggio parametri – agonen

+0

Grazie. Stavo cercando una sintassi come questa. Non volevo usare un file sql. –

0

Le soluzioni qui sono tutte hack.

il file SQL dovrebbe essere simile ...

set termout off 
set showmode off 
set heading off 
set echo off 
set timing off 
set time off 
set feedback 0 
set pagesize 0 
set embedded ON 
set verify OFF 

spool courses.sh 
SELECT 'term="' || sfrstcr_term_code || '";', 'subj="' || sfrstcr_subj_code || '";' FROM sfrstcr WHERE sfrstcr_pidm = 1234567; 
spool off 

Il seguente script di shell leggere e stampare le variabili d'ambiente di shell.

while read -r row; do 
    eval "$row" 
    echo "term=$term"; 
    echo "subj=$subj"; 
done < courses.sh 

E 'importante che tutte le variabili sono su una linea, come il comando di lettura garantisce che è possibile leggere ogni riga DB per loop.

+0

@ trenton-d-adams termout off - significa nessuna visualizzazione sul terminale. Penso che sia meglio lasciarlo attivo, a meno che non si usi il comando spool – agonen

Problemi correlati