Я видел один, но ... что такое пакет 10g? - PullRequest
2 голосов
/ 27 сентября 2011

Сценарий: я ничего не знаю о пакетах, за исключением того, что они содержат функции и процедуры, завернутые в симпатичный маленький подарок.Поэтому сегодня мне дали этот пакет (довольно большой) с инструкциями «здесь, это сломано, пожалуйста, исправьте это».

Я, наконец, все очистил, и это привело меня к моим вопросам.

В общем виде пакета, который будет экспортироваться.

1) Другоечем совокупность всего, служит ли пакет какой-либо другой цели?

2) Чтобы развернуть этот пакет, необходимо настроить пространство развертывания, чтобы уже иметь все представления / материализованные представления / и таблицы, которые содержит пакетназывается?Если нет, то я предполагаю, что пакет не будет выполнен.

3) Можете ли вы кодировать пакет, чтобы пропустить функции и процедуры, которые он не может выполнить без запуска?

4) При получениипакет, который успешно скомпилирован из одного места в другое, что еще нужно знать?

Ответы [ 3 ]

6 голосов
/ 27 сентября 2011

1) Помимо набора всего, служит ли пакет какой-либо другой цели?

Кроме этого, уменьшается необходимость перекомпиляции других процедур, которые зависят от конкретной процедуры, когда конкретная процедура изменяется.

Рассмотрим (обычный, не пакетный) procedure XYZ(a in number), который вызывается многими другими процедурами. Если эту процедуру изменить, все остальные процедуры необходимо перекомпилировать, что может снизить доступность системы.

С другой стороны, если процедура объявлена ​​в package и определена в package body, а процедура изменяется только в теле, (почти) перекомпиляция не происходит.

2) Для развертывания этого пакета необходимо настроить пространство развертывания, чтобы уже были все представления / материализованные представления / и таблицы, которые вызывал пакет? Если нет, я предполагаю, что пакет не будет выполнен.

Нет, вы можете установить package body без зависимых представлений или таблиц. Состояние тела пакета будет тогда INVALID, и никакие функциональные возможности тела пакета не будут использоваться.

3) Можете ли вы закодировать пакет, чтобы пропустить функции и процедуры, которые он не может выполнить без бомбардировки?

Не уверен, что именно вопрос. Если состояние тела пакета НЕДОПУСТИМО, код не может быть выполнен, следовательно, «бомбардировка» не может произойти.

Однако, если бомбардировка происходит по логической причине (например, деление на ноль), вы всегда можете прибегнуть к конструкции exception when others then.

4) Что еще нужно знать при доставке пакета, который успешно скомпилирован из одного места в другое?

Опять же, не уверен, что вы имеете в виду здесь. Не могли бы вы уточнить, что такое одно место ? Схема? Экземпляр? Инсталляция, компания ....?

4 голосов
/ 27 сентября 2011

1) Ну, вы почти можете думать о пакете как об аналоге класса. Это логическая группа связанных методов. Это также позволяет вам инкапсулировать связанные «вспомогательные» методы, которые не должны использоваться кем-либо еще. Они могут быть включены в пакет и доступны только для методов-членов.

2) Для успешного развертывания пакета, да, у вас должны быть необходимые таблицы, представления и т. Д. Если это не так, пакет не может выполнять какие-либо процедуры или функции, он будет не правильно развернуть. Он будет отображаться в словаре данных как не скомпилированный.

3) Определить «бомбить». Если для успешного развертывания пакета существуют необходимые объекты, то все остальное является ошибкой во время выполнения - вещи, для которых нужно кодировать. Подумайте об обработке исключений.

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

3 голосов
/ 28 сентября 2011

В дополнение к другим полезным ответам выше.

1) Заголовки пакетов также могут содержать переменные, область действия которых не ограничивается процедурой или функцией.

2) При перемещении таблиц / представлений пакетов может не потребоваться копирование, если они находятся в одной базе данных, и новая схема имеет разрешение на просмотр старых таблиц. или если ссылка на базу данных может быть использована для базы данных, которая содержит данные. В некоторых версиях базы данных могут быть ограничения на использование lobs через ссылку на базу данных. На таблицы в другой схеме необходимо ссылаться {имя-схемы}. {Имя-таблицы}. Ссылка на базу данных указывается как {имя-таблицы} @ {имя-ссылки-базы данных}. Предоставление разрешения для таблицы в другой схеме должно быть сделано явно, а не через роль - вот каков оракул

3. Если вы добавите: «исключение, когда другие тогда обнуляются»; как вторая последняя строка в процедуре (непосредственно перед «концом»), она может делать то, что вы после.

4) Для запуска пакета могут потребоваться предоставления / разрешения / роли / последовательности и, возможно, синонимы и другие зависимые пакеты procs / functions. На самом деле на любой объект в исходной схеме можно ссылаться в пакете, и он может быть необходим, или может потребоваться предоставление на него разрешения.

...