SQL*PLUS -L选项巧用

SQLPLUS -L选项说明
 -L     只尝试登录一次, 而不是在出错时再次提示。


==原先代码==

# date time stamp for use throughout the script
datetime=`date '+%Y %m %d _ %H %M %S' | sed 's/ //g'`;


#Execute the sql file via SQLPlus
v_date=`($ORACLE_HOME/bin/sqlplus -s /NOLOG < connect username/passwd@DBNAME;
set head off
select 'NEWDATE',to_char(SYSDATE,'MMDDYY') from dual;
EOF
) | awk '/NEWDATE/{print $2}' `
echo "rundate:" $v_date

==问题==
用这种方式从数据库取值,会有一个问题,当sqlplus碰到错误(数据库连不上,代码错误等),sqlplus退出代码不为0时,只是v_date变量保留空值,程序并不报错,后续程序要用到该变量时会出现其他错误。

==解决==
echo "Connection test" | sqlplus -L $DATABASE_USER/$DATABASE_PASSWD@$DATABASE_NAME | grep Connected > /dev/null
if [ $? -eq 0 ]
then
   echo "OK"
sqlplus -s /NOLOG >>$LOG_FILE<< EOF
connect $DATABASE_USER/$DATABASE_PASSWD@$DATABASE_NAME;
whenever sqlerror exit sql.sqlcode
 select sysdate from dual;
EXIT;
EOF
return_code=$?
else
   echo "NOT OK"
return_code=1
fiecho "Connection test" | sqlplus -L $DATABASE_USER/$DATABASE_PASSWD@$DATABASE_NAME | grep Connected > /dev/null
if [ $? -eq 0 ]
then
   echo "OK"
sqlplus -s /NOLOG >>$LOG_FILE<< EOF
connect $DATABASE_USER/$DATABASE_PASSWD@$DATABASE_NAME;
whenever sqlerror exit sql.sqlcode
 select sysdate from dual;
EXIT;
EOF
return_code=$?
else
   echo "NOT OK"
return_code=1
fiecho "Connection test" | sqlplus -L $DATABASE_USER/$DATABASE_PASSWD@$DATABASE_NAME | grep Connected > /dev/null
if [ $? -eq 0 ]
then
   echo "OK"
sqlplus -s /NOLOG >>$LOG_FILE<< EOF
connect $DATABASE_USER/$DATABASE_PASSWD@$DATABASE_NAME;
whenever sqlerror exit sql.sqlcode
 select sysdate from dual;
EXIT;
EOF
return_code=$?
else
   echo "NOT OK"
return_code=1
fiecho "Connection test" | sqlplus -L $DATABASE_USER/$DATABASE_PASSWD@$DATABASE_NAME | grep Connected > /dev/null
if [ $? -eq 0 ]
then
   echo "OK"
sqlplus -s /NOLOG >>$LOG_FILE<< EOF
connect $DATABASE_USER/$DATABASE_PASSWD@$DATABASE_NAME;
whenever sqlerror exit sql.sqlcode
 select sysdate from dual;
EXIT;
EOF
return_code=$?
else
   echo "NOT OK"
return_code=1
fi
echo "Connection test" | sqlplus -L $DATABASE_USER/$DATABASE_PASSWD@$DATABASE_NAME | grep Connected > /dev/null
if [ $? -eq 0 ]
then
   echo "OK"
sqlplus -s /NOLOG >>$LOG_FILE<< EOF
connect $DATABASE_USER/$DATABASE_PASSWD@$DATABASE_NAME;
whenever sqlerror exit sql.sqlcode
 select sysdate from dual;
EXIT;
EOF
return_code=$?
else
   echo "NOT OK"
return_code=1
fi

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/207/viewspace-1783773/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/207/viewspace-1783773/

你可能感兴趣的:(SQL*PLUS -L选项巧用)