
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
23.05.2018, 13:34
|
|||
|---|---|---|---|
|
|||
Exception в инициализации пакета. |
|||
|
#18+
Привет коллеги. В блоке инициализации пакета обявляется переменная с пользовательсктм типом OBJECT. Причёи этот объект имеет свой конструктор, и он вызывается сразу же при объявлении переменной. Что-то типа такого: create or replace package body package_name is variable userObjectType := userObjectType.constructor_function('init-parameter'); И вот есть у нас наш АРМик, который вызывает наш пакет. Переменная пытается инициализироваться конструктором, в конструкторе происходит ошибка. На бою очень редко происходит, раз в пол-года (но приводит к тому, что сервис для клиентов останавливается). На тесте чаще, но тоже не каждый месяц, ловить сложно. Теперь мы в нашей сессии имеем инициализированный пакет, на котором не прошла инициализация объекта. При повторном обращении к пакету инициализация переменной уже не пытается пройти - пакет-то уже инициализирован! Но объект имеет значение null, и я не могу обращаться к методам объекта, возникает ошибка: "ORA-30625: method dispatch on NULL SELF argument is disallowed". Кода написано дохрена. Таких пакетов около 500 штук. Ломается в разных пакетах. Переписывать их все - очень не хотелось бы. Идеальный выход видится такой: если АРМ видит, что происходит ошибка в инициализации любого пакета - то переоткрывать сессию (коннект к базе). Но вот главный вопрос: как АРМу понять, что ошибка была именно в инициализации пакета? Можно, конечно, переоткрывать сессию по ошибке "ORA-30625: method dispatch on NULL SELF argument is disallowed". Это проще всего. Это даже решит нашу проблему. (Или даже вообще: по любой ошибке переоткрывать сессию.) Но хочется немного разобраться в механике оракла: как (в общем случае, не переписывая пакеты) не допустить исполнение пакета, у которого при инициализации произошла ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.05.2018, 13:53
|
|||
|---|---|---|---|
Exception в инициализации пакета. |
|||
|
#18+
shurka22При повторном обращении к пакету инициализация переменной уже не пытается пройти - пакет-то уже инициализирован! Starting with Oracle Database 12c Release 1, an error raised during package initialization leaves the package uninitialized. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.05.2018, 13:55
|
|||
|---|---|---|---|
|
|||
Exception в инициализации пакета. |
|||
|
#18+
Ну гугля говорит следующее: https://livesql.oracle.com/apex/livesql/file/content_C0H8TJYPQ47XQZLMUO4T7EKC9.html ..... In 12.1 and higher, when a package fails to initialize, it is marked as uninitialized. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.05.2018, 14:06
|
|||
|---|---|---|---|
|
|||
Exception в инициализации пакета. |
|||
|
#18+
shurka22...Можно, конечно, переоткрывать сессию.... Мне кажется, что DBMS_SESSION.RESET_PACKAGE или MODIFY_PACKAGE_STATE должно быть достаточно shurka22... Но вот главный вопрос: как АРМу понять, что ошибка была именно в инициализации пакета? ... В секции инициализации пакета явно доступна обработка ошибок. Т.ч. проблемы нет. Обрабатывайте ошибки, как хотите Другое дело, что инициализацию переменных нужно перенести туда, где ей и место - в секцию инициализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.05.2018, 14:30
|
|||
|---|---|---|---|
Exception в инициализации пакета. |
|||
|
#18+
Leonid KudryavtsevДругое дело, что инициализацию переменных нужно перенести туда, где ей и место - в секцию инициализации. оно то так, но мож затратно, мож логика так построена на то и есть секция в пакете, которая отрабатывает токо при первом вызове (напр заполняет пакетные переменние) не зря ж учли "багу" в 12-ке ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.05.2018, 09:26
|
|||
|---|---|---|---|
|
|||
Exception в инициализации пакета. |
|||
|
#18+
Elic Starting with Oracle Database 12c Release 1, an error raised during package initialization leaves the package uninitialized. Супер! Спасибо большое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=52&mobile=1&tid=1883955]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
28ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 293ms |

| 0 / 0 |
