ORA-06508: PL/SQL: не удалось найти вызываемый программный модуль

Я использую оракул 10g и жабу 11.5. Я пытаюсь вызвать api из анонимного блока.

Если я перекомпилирую api после добавления dbms_output.put_line, а затем попытаюсь выполнить анонимный блок, он отобразит ошибку как

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

Однако, если я завершаю текущий сеанс и открываю новый сеанс, анонимный блок будет выполнен с ошибкой.

Из-за этой проблемы, я вынужден повторно подключать сеанс каждый раз, когда я вношу изменения в API. Может ли кто-нибудь помочь, если эта проблема может быть решена путем создания любых конфигураций на уровне жабы или базы данных.

Ответ 1

Я подозреваю, что вы сообщаете только о последней ошибке в стеке:

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 объявляет хотя бы одну переменную, константу, или курсором, тогда пакет stateful; в противном случае это безстоящий.

При перекомпиляции состояние теряется:

Если тело экземпляра, пакет с сохранением состояния перекомпилирован (либо явно, с выражением "ALTER PACKAGE Statement", или неявно), следующий вызов подпрограммы в пакете вызывает Oracle Database отказаться от существующего состояния пакета и повысить исключение ОР-04068.

После того, как PL/SQL вызывает исключение, ссылка на пакет вызывает База данных Oracle для повторной инициализации пакета, который повторно инициализирует это...

Вы не можете избежать этого, если ваш пакет имеет состояние. Я думаю, что довольно редко нужно, чтобы пакет был сдержанным, поэтому вы должны пересмотреть все, что вы заявили в пакете, но вне функции или процедуры, чтобы увидеть, действительно ли это необходимо на этом уровне. Так как вы на 10g, это включает в себя константы, а не только переменные и курсоры.

Но последний абзац из цитированной документации означает, что в следующий раз, когда вы ссылаетесь на пакет в том же сеансе, вы не получите ошибку, и она будет работать как обычно (пока вы не перекомпилируете снова).

Ответ 3

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

Оригинал script был

create or replace PACKAGE BODY APPLICATION_VALIDATION AS 

V_ERROR_NAME varchar2(200) := '';

PROCEDURE  APP_ERROR_X47_VALIDATION (   PROCESS_ID IN VARCHAR2 ) AS BEGIN
     ------ rules for validation... END APP_ERROR_X47_VALIDATION ;

/* Some more code
*/

END APPLICATION_VALIDATION; /

Переписал то же самое без глобальной переменной V_ERROR_NAME и перешел на процедуру под уровнем пакета как

Измененный код

create or replace PACKAGE BODY APPLICATION_VALIDATION AS

PROCEDURE  APP_ERROR_X47_VALIDATION (   PROCESS_ID IN VARCHAR2 ) AS

**V_ERROR_NAME varchar2(200) := '';** 

BEGIN
     ------ rules for validation... END APP_ERROR_X47_VALIDATION ;

/* Some more code
*/

END APPLICATION_VALIDATION; /

Ответ 4

Я перекомпилировал спецификацию пакета, хотя изменение было только в теле пакета. Это решило мою проблему