Ошибка
ORA-04061 обычно возникает у пользователя в приложениях на основе
Oracle Database в том случае, если разработчик или DBA выполнил перекомпиляцию какого либо
PL/SQL пакета. Если пользователь через функцию приложения обращается к этому PL/SQL пакету, то он получит исключение
ORA-04061:
ORA-04061: existing state of package "PACKAGE_NAME" has been invalidated
PL/SQL пакет вследствие перекомпиляции получает статус INVALID, обнуляются все глобальные пакетные переменные. Пользователь начинает звонить в техподдержку, если это рабочая система и выполнялось какое-либо серверное обновление, разработчик начинает приходить в ярость при отладке серверного кода приложения. Разработчики очень хорошо знают эту надоевшую им ошибку ORA-04061.
Вместе с тем если предпринять некоторые действия при разработке, то про эту проблему можно почти забыть. Предлагается в некоторых PL/SQL пакетах вашей системы, к процедурам и функциям которых непосредственно обращаются клиентские формы, поместить простейшую процедуру, которая ничего не делает:
PROCEDURE CHECK_PACKAGE
IS
BEGIN
NULL;
END CHECK_PACKAGE;
В клиентских формах перед обращением к функциям пакета необходимо просто однократно вызывать эту процедуру с обработкой ошибки
ORA-04061 или же с when others:
BEGIN
PACKAGE_NAME.CHECK_PACKAGE;
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
Проблема для основного числа случаев будет решена. Решение состоит в том, что если пакет в нормальном состоянии, то вызов процедуры CHECK_PACKAGE ни приведет ни к каким последствиям. Если же состояние пакета невалидное, то при вызове процедуры CHECK_PACKAGE возникнет исключение, которые мы просто проигнорируем, ведь ни в каком другом случае исключение для пустой процедуры возникнуть не сможет. А вызов необходимой функции в пакете произойдет уже в нормальном состоянии пакета и увенчается успехом.
Необходимо помнить, что состояние пакета для залогиненного пользователя при перекомпиляции PL/SQL пакета сбрасывается, обнуляются и все пакетные переменные. В этом случае надо либо не использовать пакетные переменные (очень плохая практика), либо проверять их содержимое в логике ваших пакетных процедур и функций, и в зависимости от этого корректировать логику работы вашего кода.
Смотрите также:
Оставьте свой комментарий
Вы должны быть авторизированны, чтобы оставить комментарий.