Функция Ksh для запроса Oracle с возвращаемыми значениями - PullRequest
0 голосов
/ 30 января 2012

Некоторое время назад я написал небольшую подпрограмму для выполнения некоторых быстрых и грязных запросов (и я имею в виду, что она не используется для больших запросов) к БД Oracle, но также хотел сделать это немного проще для анализа ошибок,Следует:

# 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;, он все равно не дал бы правильное возвращаемое значение, таким образом пропуская тест на ошибку.

Я не особенно хорош с sqlplus или ksh,возможно просто упускает что-то очевидное ... Может ли кто-нибудь помочь мне здесь?

Спасибо!

1 Ответ

2 голосов
/ 30 января 2012

я верю $? возвращает состояние завершения команды 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 $?
...