Oracle - предотвращение ошибок недействительности - PullRequest
1 голос
/ 13 января 2010

Я заметил, что всякий раз, когда у меня есть константы уровня пакета (или любые другие переменные в этом отношении), всякий раз, когда я перекомпилирую пакет, постоянные соединения с базой данных получают ошибку, что «существующее состояние тела пакета было признано недействительным».

Есть ли способ избежать этого? Возможно через синонимы? Каковы лучшие практики в этом случае?

Ответы [ 3 ]

3 голосов
/ 13 января 2010

В целом, вам следует избегать замены кода в действующем производственном экземпляре.

Если вы действительно действительно должны быть в режиме реального времени 24/24 7/7, и вы не можете запланировать ЛЮБОЕ (даже крошечное) время простоя, вам придется избегать переменных уровня пакета, так как перекомпиляция пакет вызовет вышеупомянутую ошибку.

Вы также можете перехватить ошибку в приложении client и решить, что делать. Возможно, у вас достаточно информации для перезапуска того, что делал клиент.

Смотри также

Эта тема на AskTom охватывает ту же тему.

1 голос
/ 14 января 2010

Проблема в том, что если в 10:00 утра начинается сеанс и константа устанавливается на «A», то в 11:00 утра вы меняете его на «B», а затем сеанс «взрывается» в замешательстве.

Прагма Serially_Reusable может работать для вас. В основном это не будет сохранять состояние между вызовами. Таким образом, в 11:00 он просто начнет использовать «B». Если вы можете быть на 100% уверены, что это не сломает ваш код, это может сработать. Повторная инициализация констант всякий раз, когда они необходимы, может быть непроизводительной.

Также посмотрите на вызов DBMS_SESSION.MODIFY_PACKAGE_STATE или DBMS_SESSION.RESET_PACKAGE через соответствующие интервалы. Это может уменьшить количество ошибок, которые вы получаете.

Вам также следует взглянуть на Переопределение на основе издания в новом 11gR2 . Это более всеобъемлющее решение, но я думаю, вам нужно обновить его.

0 голосов
/ 14 января 2010

В прошлом я справлялся с этим, перемещая все связанные с состоянием вещи в отдельные пакеты.

Например, если бы у меня был пакет "CUSTOMER_PKG", я бы переместил все глобальные переменные в пакет только для спецификации с именем "CUSTOMER_GLOBALS_PKG".

К сожалению, это означает раскрытие всех частных глобальных переменных, которые были определены в теле пакета. Нам пришлось применять стандарт разработки, чтобы CUSTOMER_GLOBALS_PKG разрешалось ссылаться только на CUSTOMER_PKG.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...