2009-09-09 10 views
8

J'ai un script KornShell (ksh) qui se connecte à SQL * Plus et exécute un script. Dans le script shell, je voudrais capturer le code d'état de l'instruction SQL exécutée. Actuellement il y a une erreur avec SQL et je suis incapable de le capturer en vérifiant $ ?. Comment puis-je capturer le code de succès ou d'erreur à partir de l'instruction SQL et le transmettre au script shell.Comment capturer un code de sortie SQLPlus dans un script shell?

Snippet du script 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 

script SQL 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 
/

Répondre

12

Avez-vous essayé d'utiliser

whenever sqlerror exit sql.sqlcode 

dans votre script SQL? (Voir aussi this link)

+0

@ChristopheD C'est exactement ce dont j'avais besoin! Thx – AieshaDot

+3

Je peux me tromper, mais cela ne fonctionnera pas pour les erreurs de connexion ou d'autres erreurs qui empêcheraient sqlplus d'exécuter le code sql. Je travaille ceci maintenant, et la meilleure solution que j'ai trouvée est de grep -c "ERROR" $ {LOG_FILE}>/dev/NULL le fichier journal que nous transmettons à la sortie de sqlplus pour la chaîne ERROR et de vérifier le code de retour de cela. Y a-t-il une meilleure solution? – Casey

+1

ce lien ne fonctionne plus –

1

sortie du fichier sql avec

exit sql.sqlcode; 

capture en coquille avec $?

Questions connexes