2011-02-10 12 views
6

Moim wymaganiem jest zapisanie wyniku operacji sqlplus do zmiennej w moim skrypcie powłoki. muszę wynik następującego działania, który jest w moim .sh plikuJak przechowywać wynik z SQLPlus do zmiennej powłoki

sqlplus 'user/pwd' @test.sql 

Próbowałem już

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

ale to nie działa.

EDIT ::

Zmieniłem go

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

i mówi

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

Próbowałem z

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

i daje ten sam błąd. Kiedy próbuję bez zmiennej przypisania jak poniżej

sqlplus foo/[email protected] @test.sql 

działa dobrze

+0

W powłoce typu Bourne'a (takiej jak bash), składnia nie pozwala na spacje wokół '='. –

Odpowiedz

9

zatrudniać backticks:

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

czy powinno być z składniowej paskudztwo:

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

ty wyraźnie wiedzieć, aby wziąć prawo sql * oraz polecenia do ograniczenia superflu ous wyjście, tak? :) i oczywiście uważaj, że backticking spowoduje zwinięcie białych znaków na wyjściu.

+1

"backticking spowoduje zwinięcie białych znaków wyjścia" - nie będzie. Po prostu usunie ciągłe znaki nowej linii. Poza tym nie ma nic staromodnego w używaniu '$()', to raczej na odwrót. –

+1

Jest odwrotnie: backticks są "old school". Białe spacje nie są tracone przy wyznaczaniu. Jest on tracony na wyjściu, jeśli zmienna nie jest cytowana. –

+0

Tak, masz rację co do '$()' Tak naprawdę edytowałem później, aby dodać drugą opcję i zapomniałem się przełączać. – Xailor

1

Ponieważ polecenia w ramach $() są wykonywane w podpowłoce, upewnij się, że masz wszystko, czego potrzeba do wywołania wyeksportowanego sqlplus. W tej chwili natknąłeś się na numer PATH.

13

Spróbuj to zamiast:

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

-s wyłącznik wyłączy wszystkie informacje głowicy, kiedy SQLPLUS uruchamia. Chcesz również wyłączyć opinie, nagłówki i rozmiar strony na 0. Jestem starszą szkołą, więc nadal używam tyknięć wstecz :)

+0

powinien dodać weryfikować, w przypadku przekazywania parametrów – agonen

+0

Dzięki. Szukałem takiej składni. Nie chciałem używać pliku sql. –

0

Rozwiązania tutaj to wszystkie hacki.

Plik SQL powinien wyglądać następująco ...

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 

Poniższy skrypt będzie czytać i wydrukować zmienne środowiskowe.

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

Ważne jest, aby wszystkie zmienne były w jednym wierszu, ponieważ polecenie odczytu zapewnia odczyt każdego wiersza DB na pętlę.

+0

@ trenton-d-adams termin off - oznacza brak wyświetlania do terminala. Myślę, że lepiej go zostawić, chyba że użyjesz polecenia buforowania – agonen

Powiązane problemy