HAndling Исключение, когда пользователь отменяет процедуру ORA-01013 - PullRequest
5 голосов
/ 14 марта 2012

У нас есть процедура, которая обрабатывает много записей в базе данных.Теперь иногда, если процедура занимает слишком много времени, пользователь отменяет процедуру вручную, выбрасывая ИСКЛЮЧЕНИЕ ORA-01013.Однако мы все равно хотели бы знать, сколько записей было обработано до отмены процедуры.Мы попытались сгенерировать журнал, который был вызван в блоке EXCEPTION WHEN OTHERS, но любой код в этом блоке, похоже, не работает.Мы даже пытались поднять ИСКЛЮЧЕНИЕ на PRAGMA INIT EXCEPTION для ORA-01013 безрезультатно.Код, кажется, достигает исключения, но не выполняет никакого кода в нем.Я предполагаю, что, поскольку процедура отменена, код в блоке EXCEPTION не имеет времени что-либо делать и просто выключается.

Любая идея, как получить количество обработанных записей до того, как процедураотменен?Я мог пытаться увеличивать рекорд каждый раз, когда происходит commit, но мне было интересно, есть ли лучший способ добиться этого

Ответы [ 2 ]

4 голосов
/ 14 марта 2012

Вы можете записать ход выполнения в автономной транзакции .

, то есть записать строки, обработанные в таблицу журнала, в отдельной транзакции (со своими собственными коммитами) через AT, что-то вроде:

CREATE OR REPLACE 
PROCEDURE log_progress (
   p_id   IN NUMBER,
   p_data IN VARCHAR2
)
AS
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
   INSERT INTO log_table
   (
    id,
    logging_data
   )
   VALUES
   (
    p_id,
    p_data
   );
   --
   COMMIT;
EXCEPTION
   WHEN others
   THEN
      -- Log the error here
      ...
      -- Re-raise if needed
      RAISE;
END;

Если процесс отменяется, вы можете запросить данные, зарегистрированные АТ, и выяснить, сколько строк было обработано, поскольку записи, вставленные в таблицу журнала, не будут откатываться вашим "main "транзакция.

Другим методом будет запись в файл журнала с использованием пакета UTL_FILE , а затем чтение содержимого файла в случае отмены транзакции.

Кстати, вы можете поместить (в значительной степени) любой код в секцию исключений, и он будет выполнен, если возникнет это исключение.Должна быть еще одна причина, по которой ваш код либо не выполняется, либо выполняется откат транзакцией, которая вызвала исключение.

http://www.exforsys.com/tutorials/oracle-11g/oracle-11g-exception-handling.html

Надеюсь, это поможет ...

2 голосов
/ 15 мая 2014

Я только что испытал то же самое - похоже, недокументированная ошибка:

ORA-01013 просто не перехватывается КОГДАМИ ДРУГИМИ ... Я должен добавить явный блок WHEN ORA-01013, чтобы перехватывать и обрабатывать исключения ... Хотя в документации явно указано, что КОГДА ДРУГИЕ будут перехватывать ВСЕ ИСКЛЮЧЕНИЯ RUNTIME .-

Код для проверки:

Этот код должен всегда печатать «ИСКЛЮЧЕНИЕ ДРУГИХ», но печатать «ИСКЛЮЧЕНИЕ ОТМЕНЕНО» на 11g - может ли кто-нибудь подтвердить это поведение?

DECLARE
  e_cancelled EXCEPTION;
  PRAGMA EXCEPTION_INIT(e_cancelled, -1013);
BEGIN
  BEGIN
    RAISE e_cancelled;
  EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('EXCEPTION OTHERS');
  END;

EXCEPTION
  WHEN e_cancelled THEN
    DBMS_OUTPUT.PUT_LINE('EXCEPTION CANCELLED');
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...