Недействительный пакет Oracle при каждом последующем вызове - PullRequest
2 голосов
/ 17 марта 2012

Метод ODP.Net вызывает упакованную хранимую процедуру, которая заново создает таблицу при каждом ее вызове. при каждом последующем вызове выдает ошибку

ORA-04061: existing state of package body "SAAP.PRICEWORX" has been invalidated
ORA-06508: PL/SQL: could not find program unit being called: "SAAP.PRICEWORX"

Как я могу обойти это?

Ответы [ 2 ]

4 голосов
/ 17 марта 2012

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

Последовательность событий может выглядеть примерно так:

  1. Таблица существует
  2. Использовать таблицу
  3. Удалить таблицу
  4. Попробуйтеиспользовать таблицу снова - пакет недействителен, поскольку таблица больше не существует.
  5. Создать таблицу - все снова в порядке.

Простой ответ - не создавать или удалять таблицу в коде.,Вместо этого создайте глобальную временную таблицу .Это позволяет таблице всегда быть там.

Гораздо худший вариант - обернуть каждый отдельный вызов, использующий эту таблицу, которая может существовать или не существовать в execute immediate.

ЕслиЯ совершенно не прав, тогда вам нужно выяснить, почему ваш пакет недействителен, и опубликовать результаты.Тот факт, что он недействителен, ничего не значит.

3 голосов
/ 17 марта 2012

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

Я должен признать, что понимаю причину, по которой Oracle выдает ошибку ORA-04061 и не выполняет повторную проверку пакетов в первую очередьраз вы называете недействительным пакет.Однако я не вижу в этом проблемы.Вы не должны создавать или удалять таблицы во время работы приложения.Зачем вам это нужно?

Если вы ищете более быстрый способ очистки таблицы, чем DELETE FROM my_table, используйте TRUNCATE TABLE my_table.Обратите внимание, что TRUNCATE - это DDL, как CREATE, ALTER и DROP, поэтому вам нужно будет обернуть вызов в него в EXECUTE IMMEDIATE.

...