使用返回值查询Oracle的Ksh函数

时间:2012-01-30 15:40:46

标签: oracle sqlplus ksh

前段时间我写了一个小例程来运行一些快速的'脏查询(并且我的意思是它不用于大型查询)对Oracle DB,但也想要更容易解析错误。如下:

# Executes the query
#
# Will execute a query contained in the variable named
# in the parameter $4 and store the result in the variable
# named in $5.
# In case of errors (even SQL related) the function should 
# exit with status 1, making it possible to "if execQuery".
# 
# @param    $1 = User
#           $2 = Pasword
#           $3 = Tns Alias
#           $4 = Name of the variable containing the query
#           $5 = Name of the variable to hold the result
#
# @return   query execution status
function execQuery {
    typeset eSQLU=$1
    typeset eSQLP=$2
    typeset eSQLS=$3
    typeset etQUERY=$4
    eval typeset eQUERY=\$$etQUERY
    typeset eQRES=$5
    logMessageFile "DEBUG" "Query: $eQUERY"

    typeset res=$(sqlplus -s $eSQLU/$eSQLP@$eSQLS <<EOF
set echo off newpage 0 space 0 pagesize 0 feed off head off verify off lines 999
WHENEVER SQLERROR EXIT 1
$eQUERY
exit;
EOF
)
    [[ $? -gt 0 ]] && return 1 || eval "$eQRES=\"$res\""

}

这个功能的想法是,以后我可以做类似的事情:

query="select sysdate from dual;"
if execQuery $RAID_APP_PI_USR $RAID_APP_PI_PWD $RAID_APP_PI_SID query result ; then
    echo $result
    logMessageFile "INFO" "Inserts into XX successful."
else
    logMessageFile "ERROR" "Error insertando XXX."
fi

它有点工作...一个正确编写的查询将做得很好,结果变量都正确评估和所有。问题是错误。如果该示例中的查询类似于select * potato potato;,则它仍然不会产生正确的返回值,从而错过了错误测试。

我对sqlplusksh并不是特别擅长,可能只是遗漏了一些明显的东西......有人可以帮我一把吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

我相信$?返回typeset命令的退出状态,而不是sqlplus命令。

将SQLPLUS语句的结果输​​出到文件而不是输入变量可能更容易。然后你可以用grep读取该文件,查找“ORA-”消息,或者检查退出状态变量。

sqlplus -s $eSQLU/$eSQLP@$eSQLS > querylog.tmp <<EOF 
set echo off newpage 0 space 0 pagesize 0 feed off head off verify off lines 999 
WHENEVER SQLERROR EXIT 1 
$eQUERY 
exit; 
EOF

echo $?