FoxBase!
msgbartop
Блог Oracle разработчика
msgbarbottom
foxbase

14.08.2010 Способ борьбы с ORA-04061 в приложениях

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




Смотрите также:



Оставьте свой комментарий

Вы должны быть авторизированны, чтобы оставить комментарий.