Свойства процедур и функций во многом схожи:
Могут возвращать более одного значения, используя параметры OUT.
Состоят из раздела объявлений, выполняемого раздела и раздела исключительных ситуаций.
Могут принимать значения по умолчанию.
Могут вызываться при помощи позиционного или именного представления.
Могут принимать параметры NOCOPY
Так когда же использовать функцию, а когда процедуру? Это обычно зависит от ожидаемого числа возвращаемых значений и от того, для чего они будут применяться. Принято руководствоваться следующим правилом: если возвращается более одного значения, то следует использовать процедуру, а если одно — функцию. Функции могут иметь параметры OUT (т.е. возвращать несколько значений), однако это считается некорректным стилем программирования. Функции можно вызывать также и из SQL-операторов (см. главу 10).
Модули
Модуль (package) — еще одно средство, пришедшее в PL/SQL из языка программирования Ada. Модуль — это конструкция PL/SQL, которая позволяет хранить связанные объекты в одном месте. Модуль состоит из двух частей: описания и тела. Они хранятся по отдельности в словаре данных. В отличие от процедур и функций, которые могут содержаться локально в блоке или храниться в базе данных, модули могут быть только хранимыми и никогда локальными. Помимо того, что модули позволяют группировать связанные объекты, они полезны еще и тем, что ограничений, налагаемых зависимостями, в них меньше, чем в хранимых подпрограммах. Кроме
того, они имеют ряд свойств, улучшающих функционирование системы (см. главу 10).
В сущности, модуль представляет собой именованный раздел объявлений. Все, что может входить в состав раздела объявлений блока, может входить и в модуль: процедуры, функции, курсоры, типы и переменные. Размещение их в модуле полезно тем, что это позволяет обращаться к ним из других блоков PL/SQL, поэтому в модулях можно описывать глобальные переменные PL/SQL (внутри одного сеанса работы с базой данных).
Описание модуля
В описании, или спецификации, модуля (package specification), называемом также заголовком модуля (package header), содержится информация о составе модуля, однако в описание не входит текст процедур. Рассмотрим пример:
В модуле ClassPackage содержатся три процедуры, тип и исключительная ситуация. Общий синтаксис создания заголовка модуля выглядит следующим образом:
Элементы модуля (описания процедур и функций, переменные и т.д.) аналогичны тому, что указывается в разделе объявлений анонимного блока. Для заголовка модуля действуют те же синтаксические правила, что и для раздела за исключением объявлений процедур и функций. Перечислим эти правила:
• Элементы модуля могут указываться в любом порядке. Однако, как и в разделе объявлений, объект должен быть объявлен до того, как на него будут произведены ссылки. Например, если частью предложения WHERE курсора является некоторая переменная, она должна быть объявлена до объявления курсора.
• Совсем не обязательно, чтобы присутствовали элементы всех видов. К примеру, модуль может состоять только из описаний процедур и функций и не содержать объявлений исключительных ситуаций или типов.
• Объявления всех процедур и функций должны быть предварительными. В предварительном объявлении (forward declaration) описываются подпрограмма и ее аргументы (если есть), но не включается программный текст (см. главу 10). В этом отличие модуля от раздела объявлений блока, где могут находиться как предварительные объявления, так и текст процедур и функций. Программный текст процедур и функций модуля содержится в теле этого модуля.
< Предыдущая | Следующая > |
---|