Я подозреваю, что вы сообщаете только о последней ошибке в стеке, например:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "schema.package" has been invalidated
ORA-04065: not executed, altered or dropped package body "schema.package"
ORA-06508: PL/SQL: could not find program unit being called: "schema.package"
Если да, то это потому, что в вашем пакете сохраняется состояние:
Значения переменных, констант и курсоров, которые объявляет пакет (либо в его спецификации, либо в теле), составляют его состояние пакета. Если в пакете PL/SQL объявлена хотя бы одна переменная, константа или курсор, то пакет является отслеживающим состояние; в противном случае он не имеет состояния.
При перекомпиляции состояние теряется:
Если тело созданного пакета с отслеживанием состояния перекомпилируется (либо явно, с помощью оператора ALTER PACKAGE, либо неявно), следующий вызов подпрограммы в пакете приводит к тому, что Oracle Database отбрасывает существующее состояние пакета и возбуждает исключение ORA. -04068.
После того, как PL/SQL вызовет исключение, ссылка на пакет заставляет Oracle Database повторно создать экземпляр пакета, который повторно инициализирует его...
Вы не можете избежать этого, если ваш пакет имеет состояние. Я думаю, что довольно редко действительно требуется, чтобы пакет сохранял состояние, поэтому вам следует пересмотреть все, что вы объявили в пакете, но вне функции или процедуры, чтобы увидеть, действительно ли это необходимо на этом уровне. Однако, поскольку вы используете 10g, это включает в себя константы, а не только переменные и курсоры.
Но последний абзац из цитируемой документации означает, что в следующий раз, когда вы будете ссылаться на пакет в том же сеансе, вы не получите ошибку и он будет работать как обычно (пока вы не перекомпилируете его снова).
person
Alex Poole
schedule
15.10.2013
dbms_output
). - person Alex Poole   schedule 15.10.2013