2013-12-19 2 views
3

Мои пользователи java получают ошибки «unit not found», но мой пакет VALID. Другое сообщение предложило основную причину: мой пакет не должен быть апатридом. Это имеет смысл, но я неясен в отношении реального определения апатридов Oracle:Как определяется определенный пакет pl/sql?

будет ли он квалифицироваться как безгосударственный, если я удалю все объявленные типы из SPEC пакета или мне также придется удалить все GLOBAL-переменные из тело также?

вот как Oracle определяет без гражданства:

«Значения переменных, констант и курсоров, что пакет заявляет (в любом его спецификации или тела) содержат его состояние пакета, если в PL/SQL. пакет объявляет хотя бы одну переменную, константу или курсор, тогда пакет имеет состояние, в противном случае он не имеет состояния ».

это тот же вопрос, как был поднят на этом посту он появляется:

ORA-06508: PL/SQL: could not find program unit being called

+2

Это произойдет, если приложение открыло активный сеанс, и был вызван пакет с более ранними ссылками, и тем временем кто-то перекомпилировал пакет. Вы много перекомпилируете? – OldProgrammer

+1

Ответ на этот вопрос подводит итог, но вынос заключается в том, что развертывание пакета должно быть привязано к развертыванию приложения. – Pedantic

ответ

4

это будет квалифицироваться как без гражданства, если удалить все заявленные виды из SPEC упаковки, или мне также нужно удалить все GLOBAL-переменные из тела?

От тела также. Единственная разница между переменными (или константами, типами и т. Д.), Указанными в спецификации и в теле, заключается в том, что те, кто в теле, являются частными и могут быть отнесены только к телу, в то время как те, которые указаны в спецификации, могут быть видны и используется снаружи.

documentation также упоминает, что константы времени компиляции не делают пакет неустойчивым с 11gR2, но поскольку вы говорите о переменных, которые, вероятно, не слишком полезны.

(Надеюсь, что глобальные значения будут означать переменные, которые объявлены вне процедуры или функции, эти переменные по-прежнему ограничены одним сеансом, они не являются глобальными в сеансах, поскольку эта метка может подразумевает).

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

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

Как @pedantic прокомментировал, и я пренебрег тем, чтобы прояснить это, это когда-нибудь будет подходящим в средах разработки, где короткий и повторяющийся цикл обновления делает это необходимым; даже с пакетами без гражданства вы не должны реально развертывать изменения в живой системе во время ее использования.

+0

Alex, часто нам предлагается обновлять информацию о рабочих средах, а процесс развертывания обновлений вызывает ошибки состояния пакета. На этом этапе я просто перезагружаю сервер, перезагружая пул соединений. . Вы получаете то, о чем просите. :) – Pedantic

+0

Да, это все хорошо, если вы никогда не сможете взять систему и работаете с данными 7by24, которые полагаются на ваши пакеты Oracle. Это мой случай. Мы должны перенаправить весь трафик передачи данных на хост Oracle с отказоустойчивостью, выполнить повторную компиляцию, а затем перенести их все на основную, что является большой болью. Я ищу более элегантные способы, если они существуют это, не смывая пул .. java люди тоже не ценят. Спасибо за хорошие идеи - очень ценю! – user3119949

+0

Теперь вернемся к определению пакета без состояния: если я выберу как объявления спецификаций типов, так и типы тела вне процедур и функций, сделает это безстоящим? Под «глобальным» я имел в виду глобальное отношение к корпусу пакета, а не через сеансы Oracle, а не глобальный контекст в SGA, а не тот, который ... исправьте, я немного замедляю это. Большое спасибо за предложения! – user3119949

Смежные вопросы