Некоторое время назад я написал небольшую подпрограмму для выполнения некоторых быстрых и грязных запросов (и я имею в виду, что она не используется для больших запросов) к БД 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
,возможно просто упускает что-то очевидное ... Может ли кто-нибудь помочь мне здесь?
Спасибо!