Как вернуть код ошибки в случае ошибки компиляции plsql из sqlplus - PullRequest
0 голосов
/ 10 ноября 2011

Я использую "WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;"в моих сценариях plsql, чтобы использовать их в сценариях оболочки.Это отлично работает:

echo exit | sqlplus user/pass@XE  @normal.sql && echo "boo"

Выполняет скрипт и печатает "boo". Это тоже отлично работает:

echo exit | sqlplus user/pass@XE  @bad.sql && echo "boo"

"boo" не печатается.

Однако вcase bad is:

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 Ответ

2 голосов
/ 10 ноября 2011

Вам нужно будет проанализировать их из вывода. Коды ошибок Unix находятся в диапазоне от 0 до 255, и там спрятаны всевозможные маски и сигналы. Таким образом, вы не можете записывать номера ошибок оракула в кодах ошибок 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
...