【问题标题】:Ksh function to query Oracle with return values使用返回值查询 Oracle 的 Ksh 函数
【发布时间】:2012-02-22 09:36:35
【问题描述】:

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

# 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;,它仍然不会产生正确的返回值,从而错过了错误测试。

我对@9​​87654324@ 和ksh 不是特别擅长,可能只是漏掉了一些明显的东西……有人可以帮我看看吗?

谢谢!

【问题讨论】:

    标签: oracle sqlplus ksh


    【解决方案1】:

    我相信 $?正在返回 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 $?
    

    【讨论】:

    • 这实际上是我在另一个函数中为更大的查询所做的......虽然我想保持这个函数简单,但我真的希望我有办法在不解析的情况下获取查询的实际结果它或使用文件...它可能让我对脚本的并发、多次执行和异常中断(即解析错误的文件或到处都是临时文件)感到头疼。正如我所说,它确实适用于更大的功能..只是不想在这个更简单的功能中遇到所有这些麻烦..
    • 我不知道 Korn Shell 是否可以做你想做的事情。如果是赋值语句的一部分,Bash 允许将子 shell(命令替换)的退出状态传递回主 shell,但对于 KSH,您最好的选择可能是临时文件。您始终可以为临时文件创建一个有保证的唯一文件名,并每天清除它们...
    • 我最好不要将用户 ID 和密码传递给 SQL*Plus - 使用 sqlplus /nolog' option and then immediately using 'CONNECT $eSQLU/$eSQLP@$eSQLS 会阻止这种情况。
    • @AdamMusch 嘿,谢谢。在我的特定情况下,这并不是一个真正的问题,但在一般情况下肯定是相关的。我不妨更新一下。
    • @NWest 是的。我一直在谷歌搜索,那个答案不断出现......我会把这个问题留待一段时间,但如果没有新的东西出现,那就是它。
    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多