2009-09-09 20 views
8

Mam skrypt KornShell (ksh), który loguje się do SQL * Plus i wykonuje skrypt. W skrypcie powłoki chciałbym uchwycić kod statusu instrukcji SQL, która została wykonana. Obecnie wystąpił błąd w SQL i nie jestem w stanie go przechwycić, sprawdzając wartość $ ?. Jak przechwycić kod sukcesu lub kod błędu z instrukcji sql i przekazać go do skryptu powłoki.Jak przechwycić kod zakończenia SQLPlus w skrypcie powłoki?

fragment skryptu ksh:

sqlplus $JDBC_FBUID_U/[email protected]$JDBC_FBDB @${FBC_HOME}/FBCS003.sql ${outputfile} 
if [ $? != 0 ] 
then 
    msg_txt="The execution of Sql script /tmp/FBCS003.sql failed. Please investigate." 
    echo ${msg_txt} 
    echo ${msg_txt} | mailx -r ${fromemail} -s "FBCB003: The execution of Sql script /tmp/FBCS003.sql failed." ${toemail} 
    epage -n ${pagerdef} ${pagernum} "FBCB003: ${msg_txt}" 
    exit 1 
fi 

SQL skrypt FBCS003.sql

-- Set SQLPlus variables. 
SET NEWPAGE 0 
SET WRAP OFF 
SET LINESIZE 9999 
SET ECHO OFF 
SET FEEDBACK OFF 
SET VERIFY OFF 
SET HEADING OFF 
SET PAGESIZE 0 
SET COLSEP | 
SET TRIMSPOOL ON 
SET TIMING ON 

-- Open output file 
-- The file path and name are passed from the calling script FBCS003. 
spool &1 

-- Main Select Statement 
select 
ct.fiscal_yr_no, 
ct.acct_per_no, 
ct.bus_unit_id, 
ct.btch_file_seq_no, 
ct.comm_tran_srce_cd, 
ct.rec_no, 
ct.rev_gl_acct_no, 
ct.gl_prod_cd, 
ct.prod_desc, 
ct.paid_ir_no, 
ct.srce_ir_no, 
ct.ir_no_house_acct_rsn_txt, 
ct.vndr_acct_ty_id, 
ct.clnt_na, 
ct.issr_na, 
ct.clnt_na, 
ct.issr_na, 
ct.trd_da, 
ct.setl_da, 
ct.ord_ty_cd, 
ct.actv_ty_cd, 
ct.prin_amt, 
ct.grs_comm_amt, 
ct.net_comm_amt, 
ct.vndr_prod_ty_cd, 
ct.vndr_stmt_id 
from fin.comm_tran ct 
where ct.bus_unit_id = 'EJL' 
and ct.vndr_acct_ty_id in 
('11111111','222222222') 
-- Execute sql statement. 
/

-- Close output file 
spool off 

-- Exit SQL 
exit 
/

Odpowiedz

12

Czy próbowali za pomocą

whenever sqlerror exit sql.sqlcode 

w skrypcie SQL? (Patrz także this link)

+0

@ ChristopheD To jest dokładnie to, czego potrzebowałem! Thx – AieshaDot

+3

Mogę się mylić, ale to nie zadziała w przypadku błędów połączenia lub innych błędów, które uniemożliwiłyby sqlplus wykonywanie kodu sql. Pracuję nad tym teraz, a najlepszym rozwiązaniem, jakie znalazłem, jest grep -c "ERROR" $ {PLIK_LOGU}>/dev/NULL plik dziennika, do którego wypisujemy dane wyjściowe sqlplus dla ciągu ERROR i sprawdzania kod powrotu z tego. Czy istnieje lepsze rozwiązanie? – Casey

+1

ten link już nie działa –

1

Wyjdź z pliku sql z

exit sql.sqlcode; 

zapamięta go w skorupkach z $?