DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Связывание по имени

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

Имя формального параметра явно указано, так что PL/SQL не должен пытаться установить соответствие фактического параметра формальному на основе их порядка. Так что если вы используете связывание по имени, то можете перечислять параметры в вызове программы не в том порядке, в котором указаны формальные параметры в заголовке. Например, вы можете вызвать функцию tot_sales для новых заказов любым из следующих двух способов:
Если вы используете оба вида связывания, то все позиционные параметры должны предшествовать каким бы то ни было именованным (как это сделано в предыдущем примере).
Режимы использования параметров
Определяя параметры, вы должны указать, каким образом их можно использовать. Существуют три различных режима использования параметров.
Режим
Описание
Использование параметра
IN
Только для чтения
Значение параметра может использоваться внут­ри модуля, но изменение параметра запрещено.
OUT
Только для записи
Модуль может присвоить параметру значение, но ссылаться на него в модуле запрещено.
IN OUT
Для чтения и за­писи
Модуль может ссылаться на параметр (читать) и изменять его значение (записывать).

Режим использования определяет, каким образом программа может применять значение, присвоенное формальному параметру. Режим использования параметра задается непосредственно после указания имени параметра перед указанием его типа и значения по умолчанию.
Процедура predict_activity принимает два элемента данных: дату последнего действия и описание этого действия. В результате работы процедура возвращает также два элемента данных: описание действия (возможно, измененное) и дату следующего действия. Параметр task_desc_inout определен как IN OUT, поэтому программа может читать аргумент и изменять его значение.
Пакеты
Пакет - это сгруппированные вместе элементы PL/SQL-кода. Пакеты представляют собой физическую и логическую структуру для организации программ и других элементов PL/SQL, таких как курсоры, типы и переменные. Они также предоставляют важные функциональные средства, такие как сокрытие логики и данных, определение глобальных данных (существующих на протяжении сеанса) и работу с ними.
Правила построения пакетов
Конструкция пакета очень проста. На изучение основных элементов синтаксиса пакета и основных правил его построения потребуется совсем немного времени, но многие недели (или даже месяцы) могут уйти на то, чтобы открыть для себя все нюансы структуры пакета. В этом разделе мы рассмотрим правила, которым необходимо следовать при создании пакета.
Для построения пакета необходимо создать его спецификацию и, почти всегда, тело пакета. Необходимо решить, какие элементы попадут в спецификацию, а какие будут скрыты в теле пакета. Можно также написать блок кода, который Oracle будет использовать для инициализации пакета.
Спецификация пакета
В спецификации пакета перечислены все доступные для использования в приложениях элементы пакета, а также приведена вся информация, которая необходима разработчику для использования этих элементов (эту информацию часто называют программным интерфейсом приложения (API - application programming interface)). Разработчик должен иметь возможность работать с элементами, приведенными в спецификации, не обращаясь за разъяснениями по их использованию к коду тела пакета.
(если оно определено). В заголовке следующей процедуры указаны все три режима использования параметров:
Приведем некоторые правила создания спецификации пакета:
Вы можете объявлять элементы практически всех типов данных: числа, исключения, типы и коллекции, на уровне пакета (то есть не внутри конкретной процедуры или функции пакета). Такие данные называются данными уровня пакета. При этом следует избегать объявления переменных в пакете, тогда как объявление констант вполне допустимо.
В спецификации (или теле) пакета нельзя объявлять курсорные переменные (переменные, определяемые на основе типа REF CURSOR). Курсорные переменные не могут сохранять свое значение на протяжении сеанса (в разделе «Данные пакета» далее в этой главе будет приведена более подробная информация о длительности существования данных).
Вы можете объявлять практически любые виды структур данных, такие как коллекции, записи или тип REF CURSOR.
Вы можете объявлять в спецификации пакета процедуры и функции, но указывать можно только заголовок программы (все, что находится выше ключевого слова IS или AS).
Вы можете включать в спецификацию пакета явные курсоры. Возможны две формы явного курсора: объявление запроса может включать в себя SQL-запрос, или же запрос может быть спрятан в теле пакета, тогда в объявлении курсора будет присутствовать только предложение RETURN.
Если в спецификации пакета объявлены какие-то процедуры или функции, а также если курсорная переменная объявлена без SQL- запроса, то необходимо написать тело пакета, в котором будут реализованы эти элементы кода.
В спецификацию пакета можно включить предложение AUTHID, которое будет определять, в соответствии с какими привилегиями разрешены любые ссылки на объекты: владельца пакета (AUTHID DE- FINER) или пользователя, вызывающего пакет (AUTHID CURRENT_USER).
После оператора END в спецификации пакета можно поместить необязательную метку с именем пакета, например:

10
-- Объявление типа вложенной таблицы
11 1 9
TYPE codes_nt IS TABLE OF INTEGER;
12 13
-- Вложенная таблица объявляется на основе этого типа.
14
1 Ц
my_favorites codes_nt;

-- Тип REF CURSOR, возвращающий информацию из таблицы favorites

TYPE fav_info_rct IS REF CURSOR RETURN favorites%ROWTYPE;
19
-- Процедура, которая получает список популярных товаров
20
-- (используя определенный ранее тип) и выводит
21
-- соответствующую информацию.
22 23
PROCEDURE show_favorites (list_in IN codes_nt);
2 3
24
-- Функция, которая возвращает всю информацию
25
-- из таблицы favorites о наиболее популярном элементе.
26 97
27
FUNCTION most_popular RETURN fav_info_rct;
28
END favorites_pkg; -- Метка конца для пакета

Как видите, спецификация пакета по структуре очень похожа на секцию объявлений PL/SQL-блока. Однако важным отличием является то, что спецификация пакета не может содержать никакого кода реализации.
Тело пакета
Тело пакета содержит весь код, который необходим для реализации спецификации пакета. Тело пакета требуется не всегда, но оно обязано присутствовать при наличии хотя бы одного из перечисленных далее условий:
Спецификация пакета содержит объявление курсора с предложением
RETURN
Необходимо определить в теле пакета оператор SELECT.
Спецификация пакета содержит объявление процедуры или функции Необходимо представить полную реализацию модуля в теле пакета.
Вам требуется исполнение кода в разделе инициализации тела пакета
Спецификация пакета не включает в себя исполняемый раздел (исполняемые операторы внутри конструкции BEGIN... END); вы можете исполнять код только в теле пакета.
По своей структуре тело пакета очень похоже на определение процедуры, но имеет и некоторые отличительные особенности:
• Тело пакета может включать в себя раздел объявлений, исполняемый раздел и раздел исключений. Раздел объявлений содержит полную реализацию всех курсоров и программ, определенных в спецификации, а также определение любых приватных элементов (не приведенных в спецификации). При наличии раздела инициализации раздел объявлений может быть пуст.
Исполняемый раздел пакета принято называть разделом инициализации. Он может содержать код, который исполняется при создании в сеансе экземпляра пакета.1
Раздел исключений обрабатывает любые исключения, порожденные в разделе инициализации. Он может присутствовать в конце пакета только в случае наличия раздела инициализации.
Тело пакета может быть составлено следующими способами: оно может включать в себя только раздел объявлений, только исполняемый раздел, исполняемый раздел и раздел исключений, а также раздел объявлений, исполняемый раздел и раздел исключений.
Не разрешается использовать предложение AUTHID в теле пакета, оно должно содержаться в спецификации. В теле пакета могут использоваться любые объекты, объявленные в спецификации этого пакета.
Все правила и ограничения, существующие для объявления структур данных уровня пакета, относятся как к спецификации, так и к телу пакета. Например, запрещено объявлять курсорные переменные.
После оператора END в спецификации пакета можно поместить необязательную метку с именем пакета, например:
При первом обращении к пакету.

 









jAntivirus