2016-11-28 36 views
8

Chciałbym wiedzieć, czy jest możliwe, aby uzyskać dane wyjściowe sqlplus w pewien sposób, aby dowiedzieć się, czy moja baza danych jest w górze.Jak zweryfikować połączenie sqlplus?

Chcę uruchomić listę skryptów w bazie danych, ale zanim to zrobię, chcę wiedzieć, czy baza danych jest uruchomiona z moim skryptem.

Oto, co starałem:

sqlplus /@DB1 << EOF 
> select 1 from dual; 
> EOF 

To nie może się połączyć, ale kod powrotu sqlplus nadal mówi „wszystko OK”!

 
SQL*Plus: Release 11.2.0.4.0 Production on Mon Nov 28 10:06:41 2016 

Copyright (c) 1982, 2013, Oracle. All rights reserved. 

ERROR: 
ORA-12505: TNS:listener does not currently know of SID given in connect 
descriptor 


Enter user-name: SP2-0306: Invalid option. 
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM}] [edition=value]] 
where ::= [/][@] 
     ::= [][/][@] 
Enter user-name: [email protected]:/tmp/jcho $ echo $? 
0 

wiem mogę grep wyniku mojej kwerendy testowej tak:

a.sh

sqlplus /@DB1 << EOF 
    select 'ALL_GOOD_BOY' from dual; 
EOF 

wezwanie:

daje 1 linię czy połączenie działa, 0 w przeciwnym razie:

$ a.sh |grep ALL_GOOD_BOY|wc -l 

... To dla mnie wiele kroków. W jaki inny sposób ustawić sqlplus w trybie, w którym "nie można połączyć" daje kod powrotu "błąd"?

+1

Szczerze mówiąc uważam, że sposób z wyborem z dual jest najlepszym sposobem na sprawdzenie go. Oto kolejny wątek o bardzo podobnym temacie: http://dba.stackexchange.com/questions/4718/how-check-that-the-oracle-database-is-up – Kacper

+0

Tego się boję. Gdybym mógł się połączyć, mógłbym zmienić kod powrotu SQLPLUS, jak [tutaj] (http://stackoverflow.com/a/18111656/6019417). Ale nie wiem, czy mogę się połączyć. –

+0

Musiałem spojrzeć trochę głębiej, było tam: https://stackoverflow.com/questions/2254761/sqlplus-force-it-to-return-an-error-code –

Odpowiedz

6

Dzięki odniesienia danej przez @Kacper, mogę dostosować ten sqlplus /nolog do mojego przypadku; oto pomysł:

  1. otwarty sqlplus tylko bez podłączania
  2. ustawić określony kod zwrotny na SQLERROR - to jest to, co się dzieje, gdy connect nie
  3. kod zwrotny można odebrać jak zwykle w skrypcie rozmówcy:

a.sh

sqlplus /nolog << EOF 
WHENEVER SQLERROR EXIT 50 
WHENEVER OSERROR EXIT 66 
connect /@${MISTERY_DB} 
exit; 
EOF 

Wtedy wezwanie:

/ju $ export MISTERY_DB="eg_NON_EXISTING_DB" 
/ju $ a.sh 
SQL*Plus: Release 11.2.0.4.0 Production on Tue Nov 29 08:43:44 2016 
Copyright (c) 1982, 2013, Oracle. All rights reserved. 
SQL> SQL> SQL> ERROR: 
    ORA-12154: TNS:could not resolve the connect identifier specified 
/ju $ echo $? 
50 

związane również: Connect to sqlplus in a shell script and run SQL scripts

1

Oto inne rozwiązanie można użyć: WHENEVER SQLERROR sql.sqlcode działa na mnie (na Oracle 11g):

# try a simple SELECT FROM DUAL on previously defined database in var MY_DB 
sqlplus -s /@${MY_DB} << EOF 
    whenever sqlerror exit sql.sqlcode; 
    select 1 from dual; 
    exit; 
EOF 
ERR_CODE=$? # then $? is loaded with error received 
if [[ 0 != "${ERR_CODE}" ]] ; then 
    echo could not connect :\(
else 
    echo connection succeeded 
fi