#oracle #scripting #plsql #sqlplus
#Oracle #сценарии #plsql #sqlplus
Вопрос:
Я использую «ВСЯКИЙ раз, КОГДА SQLERROR ЗАВЕРШАЕТ SQL.SQLCODE ROLLBACK;» в моих скриптах plsql, чтобы использовать их в сценариях оболочки. Это работает нормально:
echo exit | sqlplus user/pass@XE @normal.sql amp;amp; echo "boo"
Выполняет скрипт и выводит «boo»
Это тоже отлично работает:
echo exit | sqlplus user/pass@XE @bad.sql amp;amp; echo "boo"
«boo» не печатается.
Однако в случае, если ошибка:
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;
create or replace
PACKAGE TESTING
IS
function boo (co_id number) return varchar2;
END;
/
create or replace
PACKAGE BODY TESTING
is
end;
Что, очевидно, неправильно — код ошибки не возвращается, а печатается «boo». Как я могу вернуть коды ошибок компиляции plsqsl из сценариев sqlplus?
Ответ №1:
Вам нужно будет проанализировать их из выходных данных. Коды ошибок Unix находятся в диапазоне от 0 до 255, и в них скрыты всевозможные маски и сигнальные элементы. Таким образом, вы не можете записывать номера ошибок Oracle в кодах ошибок unix.
Итак, в основном вам нужно, чтобы ваши sql-скрипты включали в себя show errors
инструкцию. Но вы НЕ хотите, чтобы WHENEVER
инструкция была там, потому что это приведет к ошибке до того, как ошибки будут напечатаны. например, bad.sql будет
create or replace
PACKAGE TESTING
IS
function boo (co_id number) return varchar2;
END;
/
show errors
create or replace
PACKAGE BODY TESTING
is
end;
/
show errors
Тогда ваш сценарий оболочки должен быть чем-то вроде:
ERR_OUT="$( sqlplus rdbds/rdbds@XE < bad.sql | egrep '^(ORA|PLS)-' )"
if [ -n "$ERR_OUT" ]
then
echo "Errors in SQL:"
echo "$ERR_OUT"
else
echo boo
fi
Комментарии:
1. Спасибо, это то, о чем я думал, но я надеялся, что есть лучший способ.
2. Вместо синтаксического анализа выходных данных «показать ошибки», возможно, было бы лучше проанализировать в sql содержимое таблицы user_errors или all_errors, как предлагается здесь: forums.oracle.com/forums/thread.jspa?threadID=692710 (там также предлагается другое — третье решение)