Захват кодов возврата из хранимой процедуры Sybase в сценарии оболочки korn

Я столкнулся с проблемой при захвате кода возврата хранимой процедуры. Я вызываю хранимую процедуру sybase в моем сценарии оболочки korn, используя оператор isql, как указано ниже.

isql -U ${APPLID} -S{SERVER}> ${sqlMsg} << EOF
use ${DATABASE}
go
exec stored_procedure
go
EOF

returncode=$?

Если внутри хранимой процедуры возникает ошибка, я не могу ее зафиксировать, если буду следовать приведенному ниже методу.

if [ $returncode -ne 0 ]
then
 print "failed"
fi

Я попытался использовать оператор возврата внутри хранимой процедуры, такой как return (1)

но это не дало мне ожидаемых результатов. Когда я повторял код возврата, он отображался как 0, даже после возврата статуса как 1. Статус возврата как 1 был замечен в журналах sql.


person user3259912    schedule 18.02.2014    source источник
comment
@@error сохраняет ошибку для последнего оператора. Он возвращает 0, если ошибки нет, или конкретный номер ошибки, если ошибка произошла.   -  person Michael Gardner    schedule 18.02.2014


Ответы (2)


Чтобы зафиксировать ошибку внутри вашего оператора sql, вам нужно будет посмотреть на @@error

returncode=`isql -U ${APPLID} -S{SERVER}> ${sqlMsg} << EOF
             use ${DATABASE}
             go
             exec stored_procedure
             go
             select @@error
             go 
 EOF`

Это должно позволить вашему условию if работать так, как вы ожидаете.

person Michael Gardner    schedule 18.02.2014

$! переменная возвращает статус выполнения программы isql, а не статус процедуры хранения. Вот почему возвращаемый код возврата печатает 0: сама программа isql работала правильно.

Чтобы получить вывод из вашей процедуры хранения, я бы перенаправил его во внешний выходной файл и прочитал его. Утилита isql имеет несколько опций для работы с входными/выходными файлами, например, -i входной_файл и -o выходной_файл для соответствующего указания входных и выходных файлов. Если у вашей процедуры хранения есть вывод, он будет отправлен в output_file. Теперь вы можете прочитать содержимое output_file из вашего скрипта с помощью простого «кошачьего» или более сложного цикла, в зависимости от содержимого output_file. Чтобы создать выходной файл с уникальным именем, используйте переменную $$, которая дает вам текущий PID скрипта. Удалите выходной файл в конце.

#!/bin/bash
output_file=output.$$
isql with all your prameters and -o $output_file
status=`cat $output_file`
echo $status
rm $output_file
person MichaelGoren    schedule 18.02.2014