Мегаобучалка Главная | О нас | Обратная связь


Модули (пакеты) package.



2019-07-03 206 Обсуждений (0)
Модули (пакеты) package. 0.00 из 5.00 0 оценок




Модули представляют собой группу процедур и функций, объединенных в один объект. Модуль в InterBase и Oracle аналогичен модулю в C. Модуль состоит из заголовка и тела. Заголовок содержит объявление функций и процедур модуля, которые доступны для доступа извне (аналог файла *.h). Тело модуля содержит реализацию функций и процедур. Если функция или процедура в теле функции не объявлена в заголовке, то она доступна только для функций и процедур данного модуля.

Модуль в Oracle помимо процедур и функций может также содержать также и данные, доступные всем процедурам и функциям модуля. Таким образом, модуль можно рассматривать, как «недокласс» со своими данными, функциями и ограничениями по доступу.

Объявление модуля включает объявление заголовка модуля и его тела.

 

Объявление заголовка модуля имеет следующий вид.

 

create package <package_name>

as begin  

 <list_items>

end

 

<list_items> - список объявлений процедур и функций.

<list_items>::={<proc_item> | <func_item>} [<list_items>]

<proc_item>::=

procedure <proc_name>[(<list_ par>)] [returns (<out_params>)];

<func_item> ::=

function <func_name>[(<list_par>)] returns <datatype>;

<list_ par> ::= <par_name> <datatype>[,<list_ par>]

<out_params> ::= <par_name> <datatype>[,<out_params>]

 

Заголовок модуля в Oracle в основном аналогичен заголовку модуля в InterBase за исключением отсутствия блока begin – end и возможности помимо функций и процедур объявлять переменные. Такие переменные по аналогии с таким языком, как, например C++ видны во всех процедурах и функциях модуля и сохраняют свое значение между их вызовами. Многотранзакционная среда требует изоляции таких переменных от других транзакций. Принятая в Oracle схема изоляции состоит в том, что переменные каждого модуля закрепляются за соединением. Таким образом, каждое соединение при обращении к модулю получает свой экземпляр переменных модуля, которые сохраняются на все время соединения.

Наличие объектов – модулей позволяет в значительной мере реализовать в рамках Oracle функционал процедур выбора InterBase. В самом деле, рассмотрим двухшаговый алгоритм. На первом шаге обращаемся к процедуре (функции) package, инициализируя переменные модуля. На втором запускаем выборку из обзора (view), содержащем вызовы функций из модуля. В результате имеем «параметризованный» обзор, а учитывая общедоступные переменные в модуле, позволяющие хранить промежуточные результаты, получаем возможности процедуры выбора.

В Oracle базовый синтаксис объявления package имеет следующий вид.

 

create [or replace package] [<schema>.]<package_name>

as

begin

 <list_items>

end

 

<list_items> - список объявлений общих переменных, процедур и функций.

<list_items> ::= {<var_item> | <proc_item> | <func_item>}

 [<list_items>]

<var_item> ::= <var_name> <datatype>;

<proc_item> ::=

procedure <proc_name>[(<list_ par>)] [returns (<out_params>)];

<func_item> ::=

function <func_name>[(<list_par>)] returns <datatype>;

<list_ par> ::= <par_name> <datatype>[,<list_ par>]

<out_params> ::= <par_name> <datatype>[,<out_params>]

 

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

 

Объявление тела модуля имеет следующий вид.

 

create package body <package _name>

as

begin  

 [<list_items>]<list_def_items>

end

 

<list_items> - список объявлений процедур и функций.

<list_items>::={<proc_item> | <func_item>} [<list_items>]

<proc_item>::=

procedure <proc_name>[(<list_ par>)] [returns (<out_params>)];

<func_item> ::=

function <func_name>[(<list_par>)] returns <datatype>;

<list_ par> ::= <par_name> <datatype>[,<list_ par>]

<out_params> ::= <par_name> <datatype>[,<out_params>]

 

<list_def_items> - список определений процедур и функций.

 <list_def_items> ::=

{<proc_def> | <func_def>} [<list_def_items>]

Базовый синтаксис определения процедуры имеет вид.

<proc_def> ::=

procedure <proc_name> [(<in_list_params>)]

[returns (<out_list _params>)]

as

[<declarations>]

begin [<psql_statements>]

end;

 

Базовый синтаксис определения функции имеет вид.

function <func_name> [(<in_list_params>)]

returns <datatype>|

as

 [<declarations>]

begin

 [<psql_statements>]

end;

 

<declarations> - объявляет необходимые переменные и курсоры.

 

<declarations> ::= <declare_item>[<declarations>]

<declare_item> ::= {<declare_var> | <declare_cursor>}

 

<declare_ var> - объявляет переменную

 

<declare_ var> ::= declare [variable] <var_ name> <datatype> [not null ] [collate <collation>] [{= | default]} <value>];

<var_name> - имя переменной

<datatype> - допустимый в SQL тип данных

 

<declare_cursor> - объявляет курсор

 

<declare_cursor> ::= declare [variable] <cur_name> [[no ] scroll] cursor for (<select_stm>);

<cur_name> - имя курсора

 

no scroll, scroll указывает, что курсор будет однонаправленными (no scroll) или двунаправленным (scroll). По умолчанию курсоры являются однонаправленными.

Курсор может быть однонаправленными прокручиваемым. Необязательное предложение

SCROLL делает курсор двунаправленным (прокручиваемым), предложение NO SCROLL —

однонаправленным. По умолчанию курсоры являются однонаправленными.

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

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

Работа с курсором подразумевает несколько действий:

- объявление курсора;

- открытие курсора;

- цикл чтения данных с проверкой на их окончание;

- закрытие курсора.

Открытие курсора осуществляется командой open.

Команда open имеет следующий синтаксис.

 

оpen <cur_name>;

 

Чтение записи из набора данных, связанного с курсором осуществляется командой fetch.

Команда fetch для последовательного чтения имеет следующий синтаксис.

fetch <cur_name> [into <list_var];

Команда fetch для управляемого чтения имеет следующий синтаксис.

fetch {next | prior | first | last | absolute <n> | relative <n>}

from <cur_name> [into <list_var];

 

Режимы next, prior, first, last определяют переход к следующей, предыдущей, первой или последней записи и ее чтение.

Режимы absolute <n>, relative <n> определяют переход к записи с номером <n> или к сдвигу в наборе на <n> записей и ее чтение.

 

<list_var> ::= [:]<var_name>[,<list_var>]

<var_name> - имя переменной, в которую помещаются считанные данные.

<n> - выражение, задающее абсолютный или относительный от текущей позиции курсора номер записи.

 

Для проверки того, что записи набора данных исчерпаны, используется контекстная переменная row_count, которая возвращает количество считанных оператором строк. Если чтение не произошло, то row_count=0, иначе 1.

Закрытие курсора осуществляется командой close.

Команда close имеет следующий синтаксис.

close <cur_name>;

 

 

Таким образом, работа с курсором обычно имеет вид.

 

declare … cursor …;

open …;

while(1=1) do

begin

 …

  fetch …;

if (row_count = 0) then leave;

 …

end

close …;

 

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

for select … do

В этом случае нет необходимости явно объявлять курсор, открывать и закрывать курсор, выполнять проверку на конец выборки.

Явное использование курсоров оправдано, прежде всего, в случаях, когда нужно вести одновременную обработку данных, получаемых из разных выборок.



2019-07-03 206 Обсуждений (0)
Модули (пакеты) package. 0.00 из 5.00 0 оценок









Обсуждение в статье: Модули (пакеты) package.

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (206)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)