|
|
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Наткнулся на странное (для меня) поведение - не могу в документации найти почему работает именно так. Дано: два пакета с глобальными переменными (то бишь не stateless) Первый: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Второй: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Вызываем метод второго пакета - получаем Код: plaintext 1. 2. 3. 4. 5. Типа всё окей, работает. Теперь в другой сессии меняю значение переменной в теле первого пакета pk_test - с 1 на 2 и перекомпилирую тело, для текущей сессии состояние пакета сбрасывается Если вызвать напрямую тот пакет, который изменили, то получим: Код: plaintext 1. 2. 3. 4. 5. 6. 7. после чего пакет автоматически пересобирается и повторный вызов проходит успешно. Меняем снова тело первого пакета, перекомпилируем body. Теперь если вызывать его через второй пакет, то постоянно получаем: Код: plaintext 1. 2. 3. и пересборки первого пакета не происходит вообще, сколько бы раз мы не вызывали второй пакет, вызывающий первый. Однако если во втором пакете в секцию обработки исключения добавить RAISE - то мы опять получим ORA-04068: existing state of packages has been discarded ORA-04061: existing state of package body "ANVANO.PK_TEST" has been invalidated и всё пересоберётся. Если добавить не просто RAISE, а какое-то конкретное исключение типа RAISE no_data_found - то пересборка опять не происходит. На чем основано такое поведение Oracle? Почему в одном случае первый пакет пересобирается после первого обращения к нему, а в другом случае не пересобирается никогда? -------------------------------------------------------------- Запомните, товарищи офицеры, чтобы ничего не делать, надо уметь делать все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2011, 12:41 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Думаю, для ответа стоит прикинуть, зачем вообще нужна ORA-4068, почему бы просто не перекомпилить тихой сапой и не работать дальше. Ответ на этот вопрос: потому что теряется состояние пакета, и если приложение об этом не узнает, оно, продолжая работу, может натворить дел. Теперь следующий вопрос: почему последующие обращения проходят успешно. Ответ: потому, что требовать глобального переподключения - слишком жестоко, неудобно для клиентов. С другой стороны после 4068 как минимум откатилась транзакция, есть надежда, что клиент обработал эту ошибку, и как следствие, начавшаяся следующая транзакция с большой вероятностью пройдёт правильно. А отсюда получается ответ на Ваш вопрос: именно потому, что клиент должен узнать (и узнаёт) об этой ошибке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2011, 13:08 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Ну тогда может кто-то посоветует, что делать если в некотором триггере на таблице вставлен анонимный PL/SQL блок для вызова некритичной для бизнес процесса функции стороннего пакета: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Исключение специально гасится, т.к. выполнение метода pk_test.some_test не должно влиять на вставку / апдейты строк таблицы в рамках основного бизнес процесса. Оно желательно, но не обязательно. Так вот после перекомпиляции тела пакета PK_TEST в лог начинает сыпаться вышеописанная ошибка ORA-06508: PL/SQL: could not find program unit being called Естественно метод прекращает отрабатывать и если не переконнектить сессию БД, в которой работает триггер - то вызова пакета PK_TEST больше никогда не происходит вообще никогда. Какие тут могут быть варианты, кроме передёргивания сессии ? Или вообще без вариантов, тронул пакет и всё, хана? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2011, 13:13 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
anvanoи пересборки первого пакета не происходит вообщеПрежде всего не путай инвалидацию программной единицы (dependenies) и инвалидацию состояния пакета (ORA-04061). Первая всегда пытается автоматически "исправиться" рекомпиляцией. Состояние же пакета может быть сброшено только после возврата управления от сервера к клиенту (после завершения server call), но не раньше: явно на уровне пакета (SERIALLY_REUSABLE Pragma) явно на уровне сессии (dbms_session.reset_package/modify_package_state) неявно на уровне сессии, если server call завершился с ORA-04068. Если ORA-04068 не возвращается клиенту, то обращение к пакету будут всё равно обламываться по ORA-06508. Но состояния других пакетов останутся несброшенными и ими можно (нужно ли?), при необходимости воспользоваться. Состояние пакетов сбрасывается, даже если искуственно породить прохождение -4068 от сервера к клиенту: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2011, 13:16 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
anvano, Курим доку, например Oracle 9i Program With PL-SQL, последняя глава, разделы "Unsuccessful Recompilation" и "Successful Recompilation". А кто будет перекомпилировать второй пакет, Пушкин? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2011, 13:30 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Всем спасибо, особенно Elic. Стало понятнее про сброс состояния пакета и в какую сторону копать доки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2011, 13:34 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
а может кто-то чуть подробней расшифровать вот эту часть феномена: Меняем снова тело первого пакета, перекомпилируем body. Теперь если вызывать его через второй пакет, то постоянно получаем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2011, 07:19 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2011, 09:12 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Elicanvanoи пересборки первого пакета не происходит вообщеПрежде всего не путай инвалидацию программной единицы (dependenies) и инвалидацию состояния пакета (ORA-04061). Первая всегда пытается автоматически "исправиться" рекомпиляцией. Состояние же пакета может быть сброшено только после возврата управления от сервера к клиенту (после завершения server call), но не раньше: явно на уровне пакета (SERIALLY_REUSABLE Pragma) явно на уровне сессии (dbms_session.reset_package/modify_package_state) неявно на уровне сессии, если server call завершился с ORA-04068. Если ORA-04068 не возвращается клиенту, то обращение к пакету будут всё равно обламываться по ORA-06508. Но состояния других пакетов останутся несброшенными и ими можно (нужно ли?), при необходимости воспользоваться. Состояние пакетов сбрасывается, даже если искуственно породить прохождение -4068 от сервера к клиенту: Код: plsql 1. Здравствуйте! Подскажите, пожалуйста, а где в документации описан третий вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2012, 16:51 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Elicanvanoи пересборки первого пакета не происходит вообщеПрежде всего не путай инвалидацию программной единицы (dependenies) и инвалидацию состояния пакета (ORA-04061). Первая всегда пытается автоматически "исправиться" рекомпиляцией. Состояние же пакета может быть сброшено только после возврата управления от сервера к клиенту (после завершения server call), но не раньше: явно на уровне пакета (SERIALLY_REUSABLE Pragma) явно на уровне сессии (dbms_session.reset_package/modify_package_state) неявно на уровне сессии, если server call завершился с ORA-04068. Если ORA-04068 не возвращается клиенту, то обращение к пакету будут всё равно обламываться по ORA-06508. Но состояния других пакетов останутся несброшенными и ими можно (нужно ли?), при необходимости воспользоваться. Состояние пакетов сбрасывается, даже если искуственно породить прохождение -4068 от сервера к клиенту: Код: plsql 1. Апну. А на уровне системы что можно что-то сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 15:54 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Melkomyagkii_newbiчто можно что-тоЧто-то чтобы что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 16:07 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
-2-Melkomyagkii_newbiчто можно что-тоЧто-то чтобы что? Торопился. У нас похожая проблема. Есть два пакета с глобальными переменными. Сейчас веб приложение ловит на них ORA-04068: existing state of packages has been discarded После ребута коннекшн пула первый раз процедура из одного и пакетов отрабатывает, потом перестает работать. Код поправить возможности нет( С ТОАДа причем процедуры обоих пакетов без проблем дергаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 16:41 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Melkomyagkii_newbi-2-пропущено... Что-то чтобы что? Торопился. У нас похожая проблема. Есть два пакета с глобальными переменными. Сейчас веб приложение ловит на них ORA-04068: existing state of packages has been discarded После ребута коннекшн пула первый раз процедура из одного и пакетов отрабатывает, потом перестает работать. Код поправить возможности нет( С ТОАДа причем процедуры обоих пакетов без проблем дергаются. Из тоада воспроизводится.. Зависит от порядка вызова пакетов. Если начать с одного, то сколько не вызывай получаю ошибку, если вызвать второй, то после этого и первый нормально вызывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 16:51 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
-2-Melkomyagkii_newbiчто можно что-тоЧто-то чтобы что? Собственно чтобы сброить стэйт пакета ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 16:52 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Melkomyagkii_newbiконнекшн пулаStateful Connection Pool?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 16:55 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
ElicMelkomyagkii_newbiконнекшн пулаStateful Connection Pool?! Да вот фиг пойми. Когда они убили пул, я в базе убедился, что сессии отвалились ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 17:02 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Melkomyagkii_newbiElicпропущено... Stateful Connection Pool?! Да вот фиг пойми. Когда они убили пул, я в базе убедился, что сессии отвалились Хм, понял что не в тему ответил, не понял вас если честно.. у меня ведь воспроизводится проблема.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 17:04 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Melkomyagkii_newbiне понял вас если честно..нужно ли сохранять значения глобальных переменных между вызовами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 18:08 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
-2-Melkomyagkii_newbiне понял вас если честно..нужно ли сохранять значения глобальных переменных между вызовами. А ну, да, должно быть не нужно, пул же. Понял теперь. Но так сложилось "исторически" - отжали проект у одной индийской компании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 18:11 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
У нас всё в итоге решилось прокидыванием эксепшена ORA-04068 наружу "до клиента". До этого как оказалось, он в некоторых местах гасился в обработчиках WHEN OTHERS, что приводило к такой вот хрени как перманентный ORA-06508. Теперь всё работает как часы. А еще в большей части пакетов вообще удалось отказаться от глобальных переменных. В итоге теперь накатывание такого тела пакета вообще не приводит ни к каким последствиям типа ORA-04068. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 23:26 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Добрый день. Подскажите, если вынести в глобальные переменные пакета константы: Код: plsql 1. 2. 3. Указанные выше проблемы возникнут, или при описании CONSTANT, изменение стояния пакета не приведет к отваливанию сеcсии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 10:26 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Код: Код: plsql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 10:28 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
GogolУказанные выше проблемы возникнутКакие? http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 13:03 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Gogol, Почему нет? Думаю, константа или не константа - не повлияет на механизм , управляющий состоянием пакета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 14:39 |
|
||
|
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
|
|||
|---|---|---|---|
|
#18+
Gogol, а не могли бы вы обьяснить зачем вам константы в пакете? почему надо именно F_NEW CONSTANT VARCHAR2(20) = 'F_NEW'; и потом использовать переменную F_NEW вместо того чтобы просто не написать 'F_NEW'? хоть раз за все время проекта такая константа менялась и вам действительно приходилось менять ее значение после выкатки в продакшн? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 15:14 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1886332]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
253ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 575ms |

| 0 / 0 |
