Как вернуть код ошибки в случае ошибки компиляции plsql из sqlplus

#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 (там также предлагается другое — третье решение)