Вы можете записать ход выполнения в автономной транзакции .
, то есть записать строки, обработанные в таблицу журнала, в отдельной транзакции (со своими собственными коммитами) через 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
Надеюсь, это поможет ...