Относительно статуса возврата команды выхода PLSQL - PullRequest
2 голосов
/ 04 апреля 2011

У меня есть скрипт test.sql, который вызывается из сценария оболочки unix test.sh. Проблема в сценарии test.sql, когда у меня есть исключение, я делаю откат и выход. Когда дело доходит до сценария оболочки, он будет иметь статус выхода ($?) Как 0 и считается успешным. Как я могу выйти со статусом ошибки из test.sql?

test.sh

sql_script=sql/test.sql

$ORACLE_HOME/bin/sqlplus -s << ENDSQL

${DATABASE_LOGIN}@${DATABASE_NAMES[${DMIN_DB}]}

WHENEVER SQLERROR EXIT 1 ROLLBACK
WHENEVER OSERROR EXIT 1 ROLLBACK

SET HEADING OFF
SET FEEDBACK OFF
SET PAGESIZE 0
SET TRIMSPOOL ON
SET SERVEROUTPUT ON

@${sql_script} $PROC_DATE

EXIT
ENDSQL

  if [ $? -ne 0 ]; then
    echo "Error in executing the insertBclErrorReport function."
  fi

Test.sql

WHILE i IS NOT NULL LOOP
BEGIN

  insert into test1(field1) values(error(i).amount);

  EXCEPTION
    WHEN others THEN rollback;
  exit;

  END;
END LOOP;

commit;

END;

Ответы [ 2 ]

4 голосов
/ 04 апреля 2011

Ваш блок PL / SQL будет перехватывать каждое исключение и обрабатывать его, просто выполняя откат.Если вы хотите, чтобы вызывающая сторона знала, что произошла ошибка, вы, скорее всего, захотите просто удалить обработчик исключений.

Вы также можете включить явный RAISE или RAISE_APPLICATION_ERROR в ваш обработчик исключений, но это не кажется особенно полезным.Поскольку сценарий SQL * Plus уже реагирует на ошибку путем отката транзакции, перехват и повторное генерирование вашего исключения в цикле PL / SQL не изменяет никакого поведения.Все, что он делает, - это скрывает фактический номер строки и стек вызовов, которые связаны с ошибкой, и затрудняет отладку ошибок.

В общем, если вы не можете обработать ошибку, нет смысла ее перехватывать.,Точно так же, если вам нужен WHEN OTHERS, то вы почти наверняка не сможете обработать ошибку и не должны ее сначала отлавливать.Теперь, если вы действительно перехватываете ошибку, регистрируете ошибку и весь стек вызовов в таблице ошибок и повторно генерируете пользовательскую ошибку, которая более значима, чем ошибка Oracle, тогда WHEN OTHERS может быть разумным.

0 голосов
/ 17 октября 2013

У меня возникла та же проблема, но после некоторой настройки, похоже, это работает на моей системе:

WHENEVER SQLERROR EXIT SQL.SQLCODE;
variable recordId number;
begin
::::::
exception
  WHEN OTHERS then
       :::::::;
      :recordId:=SQLCODE;
end;
/
exit :recordId;

---on SQL*Plus: Release 11.2.0.1.0 Production
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...