Хранимая процедура / порядок загрузки Oracle - PullRequest
0 голосов
/ 02 октября 2009

У меня есть много хранимых процедур и функций в папке. У меня есть пакетный файл, который перебирает файлы .sql в папке и записывает имена файлов в один файл SQL для выполнения. После этого командный файл выполняет один файл в SQLPlus. Проблема, с которой я сталкиваюсь, - это порядок создания хранимых процедур и функций. Я получаю ошибки компиляции, потому что хранимой процедуре C требуется функция A для выполнения, но хранимая процедура C создается перед функцией A. Есть ли способ обойти это без упорядочения хранимых процедур и функций? Я предполагаю, что нет, но я хочу быть уверен, прежде чем начать заказывать сценарии.

Ответы [ 5 ]

5 голосов
/ 02 октября 2009

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

В этом случае вы сначала должны создать все спецификации пакета, а затем создать тела пакета. Именно поэтому они разделены на спецификацию и тело.

1 голос
/ 02 октября 2009

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

Проблема заключается в синдроме «разбитых окон», при котором подлинная недостающая зависимость теряется во всем шуме. Если эта мысль вас беспокоит, вы можете скомпилировать все недействительные программные модули. Есть разные способы сделать это, но лучше всего использовать пакет UTL_RECOMP (в 10g или позже) или использовать скрипт utlrp.sql, который можно найти в %ORACLE_HOME%/rdbms/admin в более ранних версиях .

Обновление

Соломон Якобсон написал программу на PL / SQL для перекомпиляции некорректных программ; он не зависит от версии и не требует привилегий SYSDBA. Скачать.

0 голосов
/ 03 октября 2009

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

0 голосов
/ 03 октября 2009

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

Если вы когда-нибудь получите ошибку, связанную с проблемой зависимости, при выполнении сгенерированного сценария sql вы знаете, что была введена некоторая новая зависимость, и ее необходимо «описать» для того, чтобы ваш пакет ее распознал.

Да, это была бы ручная работа. Но установочный сценарий sql все равно будет сгенерирован, как сейчас.

0 голосов
/ 02 октября 2009

Просто создайте объекты (некоторые будут недействительными) и скомпилируйте их все на следующем шаге.

[Изменить]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...