2013-02-06 20 views
12
#!/bin/sh 

echo "Please enter evaluate database username" 
read eval_user 
echo "Please enter evaluate database password" 
read eval_pass 
echo "Please enter the database name" 
read db_name 

LOGFILE=shell_log.txt 

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE} 
connect $eval_user/[email protected]$db_name 
WHENEVER OSERROR EXIT 9; 
WHENEVER SQLERROR EXIT SQL.SQLCODE; 
DBMS_OUTPUT.put_line('Connected to db'); 
EOF 

if [ $? != 0 ] 
then 
echo "The upgrade script failed. Please refer to the log results.txt for more information" 
echo "Error code $?" 
exit 0; 
fi 

Podaję wartości śmieci, próbując wymusić niepowodzenie tego skryptu. Ale, co jest irytujące, wciąż idzie naprzód, nie wspominając o żadnym kodzie błędu. Co jeszcze trzeba tu zrobić?Zarządzanie obsługą błędów podczas uruchamiania sqlplus ze skryptów powłoki

+0

Które konto użytkownika OS jest uruchomione? Z jaką bazą danych loguje się skrypt? – APC

+0

Próbowałem Twojego skryptu, a plik dziennika przechwytuje kod błędu. Oto chwycenie z pliku dziennika: 'BŁĄD: ORA-01017: nieprawidłowa nazwa użytkownika/hasło; logon denied SP2-0734: nieznane polecenie zaczynające się "DBMS_OUTPU ..." - reszta linii zignorowana. " – Incognito

+0

Czy mogę wiedzieć, co dostajesz do pliku logu po uruchomieniu skryptu? – Incognito

Odpowiedz

11

To, co mówi Max, jest poprawne. Wypróbuj zmodyfikowany skrypt:

Należy zwrócić uwagę na użycie kodu sql_return_code w celu przechwycenia kodu powrotu SQLPLUS.

Instrukcja DBMS_OUTPUT powinna zakończyć się błędem - "SP2-0734: nieznane polecenie zaczynające się ...". Możesz znaleźć komunikat o błędzie w pliku dziennika.

Jest możliwe pułapki błędy w SP2 SQLPLUS 11g korzystających z obiektu rejestrowania błędów. Proszę spojrzeć na http://tkyte.blogspot.co.uk/2010/04/new-thing-about-sqlplus.html, aby uzyskać więcej informacji.

+0

Otrzymuję tylko kod błędu 122, zamiast faktycznego komunikatu o błędzie db. Czy znasz sposób, aby uchwycić wyjście? – roymustang86

+0

Komunikat o błędzie jest przekierowywany do "shell_log.txt". Spójrz na ten plik w bieżącym katalogu. Jeśli chcesz przechwycić dane wyjściowe w skrypcie powłoki, musisz usunąć przekierowanie i przypisać wynik SQLPLUS do zmiennej. Np .: - SQL_RESULT = $ (sqlplus -s/nolog << EOF KIEDYKOLWIEK SQLERROR EXIT FAILURE KIEDY OSWRÓD ZAKOŃCZ SIĘ USTERKA USTAWIĆ SERVEROUTPUT ON connect $ eval_user/$ eval_pass @ $ db_name exec DBMS_OUTPUT.put_line ('Connected to db'), zakończ EOF) ' –

+2

Skrypt powłoki w systemie operacyjnym UNIX może zwracać kody do 255. Więc nie rozumiem, jak KIEDYKOLWIEK SQLERROR WYJDJE SQL.SQLCODE; można poprawnie zwrócić kody SQL powyżej 255? E.g. ORA-12703 ta konwersja zestawu znaków nie jest obsługiwana Po prostu wykonałem test i uruchomiłem zły kod SQL, który nie zadziałał z ORA-00936: brakujące wyrażenie złe sqlplus zwróciło 168 (!) Więc rzeczywisty kod powrotu 936 został zawinięty i reszta została zwrócona. 936% 256 = 168. To nie jest poprawna odpowiedź. – Tagar

5

może się zdarzyć, że Twoje instrukcje ever zostaną wykonane po ustanowieniu połączenia z bazą danych (ponieważ zostały one później wymienione). Spróbuj następującego kodu: -

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE} 
WHENEVER OSERROR EXIT 9; 
WHENEVER SQLERROR EXIT SQL.SQLCODE; 
connect $eval_user/[email protected]$db_name 
DBMS_OUTPUT.put_line('Connected to db'); 
EOF 
1

Fakt wpisywania fałszywych wartości, są chyba tylko związane z logowaniem. Następnie: Check database connectivity using Shell script

Do WHENEVER ... służą błędy podczas wykonywania skryptu SQL. Gdy uda Ci się połączyć ze skryptem (domyślam się, że to twój problem), powinieneś otrzymać błąd, którym zarządza WHENEVER ERROR, ponieważ zapomniałeś EXEC na linii z DBMS_OUTPUT.

0

Można jedynie pułapkę błędu sql lub błędu os. Wartość dbms_output nie powiedzie się na samym poziomie sqlplus, więc gdy ustawienie błędu nie ma na nie wpływu.

3

odpowiedź Aji jest z

WHENEVER SQLERROR EXIT SQL.SQLCODE; 

a następnie za pomocą

sql_return_code=$? 

nie jest prawidłowy (lub nie poprawne w większości przypadków). Szczegóły poniżej.


Shell skrypt w UNIX OS może powrócić kody do 255. Np "ORA-12703 ta konwersja zestawu znaków nie jest obsługiwana" kod powrotu powinien być 12703, ale nie pasuje do 8-bitowego kodu powrotu w systemie UNIX.
Właściwie po prostu wykonałem test i uruchomiłem zły kod SQL, który kończy się niepowodzeniem z "ORA-00936: brakujące wyrażenie" -
sqlplus zwrócił 168 (!).
Tak więc rzeczywisty kod powrotu 936 został zawinięty w 256, a reszta została zwrócona. 936% 256 = 168.


W systemie Windows to prawdopodobnie może działać (nie testowane), ale nie w systemie UNIX (testowane jak wyjaśniono powyżej).


Jedyny niezawodny mechanizm jest prawdopodobnie do buforowania wyników do pliku dziennika, a następnie zrobić coś jak

tail -n 25 spool.log | egrep "ORA-" | tail -n 1 | cut -d: -f1 | cut -d- -f2 

Więc to grep plik dziennika szpula, a następnie wyciąć rzeczywistej najnowszą ORA-kod.

Powiązane problemy