Фуфаев - Разработка и эксплуатация удалённых БД (1084483), страница 24
Текст из файла (страница 24)
Заданный параметром зиЬзе1есг подзапрос принято называть определяю(цим. Если указана конструкция Х1ТН [САЗСАРЕР ( ЬОСАЬ) СНЕС ОРТ1ОН гарантируется, что в тех случаях, когда строка данных не удовлетворяет условию, указанному в конструкции %НЕКЕ определяющего запроса представления, она не будет добавлена в его базовую таблицу. Приведем текст представления, предназначенного для выбора из базы данных «Извешение» всех полей таблицы Лл извещения по заданному диапазону времени (начальной и конечной датам): ОЕЕАТЕ Е1ЕИ [Е извещения] АВ ВЕЬЕСТ * ееом (а извещения] ииезе ((([а извещения].[дата выпуска]) Веенееп [Введите начальную дату] Апс( [Введите конечную дату])) Для удаления представлений служит оператор ОКОР У[Е%, имеющий следующий формат записи: ПЕОР тГТЕМ утеиМате (ВЕЯТК1СТ ( САЯСАРЕ] Если в операторе задано ключевое слово КЕБТК1СТ, а в базе данных существуют объекты, зависящие от удаляемого представления, то выполнение оператора блокируется.
Если в операторе задано ключевое слово САБСАПЕ, то при выполнении оператора будут удалены все связанные с удаляемым представлением объекты. В случае эксплуатации СУБД на отдельном персональном компьютере использование представлений обычно имеет целью лишь упрощение структуры запросов к базе данных. Однако в многопользовательской сетевой СУБД представления играют ключевую роль в определении структуры базы данных и организации защиты информации. Основные преимущества использования представлений в данном случае заключаются в независимости от данных, обеспечении целостности информации и упрощении многотабличных запросов.
8.5. Разработка хранимых процедур Для приложений, работающих с БД, хранимые процедуры (Бгоге([ Ргосе([иге) — это подпрограммы, которые выполняются на сервере. По отношению к БД вЂ” это объекты, которые создают- 119 ся и хранятся в БД и могут быть вызваны из клиентских приложений. При этом одна процедура может быть использована в любом числе клиентских приложений, что позволяет существенно экономить трудозатраты на создание прикладного программного обеспечения и эффективно применять стратегию повторного использования кода. Так же как и любые процедуры в стандартных языках программирования, хранимые процедуры могут иметь входные и выходные параметры или не иметь их вовсе.
Хранимые процедуры могут быть активизированы не только пользовательскими приложениями, но и триггерами. Хранимые процедуры пишутся на базовом языке программирования, могут включать в себя любые операторы БО1., а также включают в себя некоторый набор операторов, управляющих ходом выполнения программ, во многом схожих с подобными операторами процедурно-ориентированных языков программирования. В коммерческих СУБД для написания текстов хранимых процедур используются собственные языки программирования.
Так, в СУБД Огас]е для этого используется язык Р1./Я.Н., а в МБ БО]. Бегуег — язык Тгапаасг БО1.. В последних версиях Огас1е для написания хранимых процедур объявлено использование языка 1ауа. Хранимые процедуры являются объектами БД. Каждая хранимая процедура компилируется при первом выполнении, при этом в процессе компиляции строится оптимальный план выполнения процедуры. Описание процедуры совместно с планом ее выполнения хранится в системных таблицах БД.
Для создания хранимой процедуры в БО] применяется оператор СКЕАТЕ РКОСЕР11КЕ. По умолчанию выполнить хранимую процедуру могут только ее владелец, являющийся владельцем БД, и создатель. Однако владелец хранимой процедуры может делегировать права на ее запуск другим пользователям.
Имя хранимой процедуры является идентификатором в языке программирования, на Котором она пишется, и должно удовлетворять всем требованиям, предъявляемым к идентификаторам в данном языке. В МБ БО[. Бегуег хранимая процедура создается оператором следующего формата: СВЕАТЕ РВОСЕмПВЕ <имя процедуры> [;<версия>] [[Опараметр1тип данных] [улну1ио] [=<значение по умолчанию>] [ОотР[]т]] [, .параметрн.) [ итти [ВЕСОМР1ЬЕ [ ЕИСВХРТ10И [ ВЕСОМР1ЬЕ, ЕИСВУРТ10И)] [РОВ ВЕРЫСЛТ1ОИ] АВ Тело процедуры 120 Здесь необязательное ключевое слово 1/АКИНО определяет заданное значение по умолчанию для определенного ранее параметра.
Если задано ключевое слово КЕСОМРП.Е, определяющее режим компиляции создаваемой хранимой процедуры, то данная процедура будет перекомпилироваться каждый раз, когда будет вызываться на исполнение, что может резко замедлить ее исполнение. Однако, с другой стороны, если данные, обрабатываемые данной хранимой процедурой, настолько динамичны, что предыдущий план исполнения, составленный при ее первом вызове, может быть абсолютно неэффективен при последующих вызовах, стоит применять данный параметр при создании этой процедуры. Ключевое слово Е)ЧСКУРТ10Х определяет режим, при котором исходный текст хранимой процедуры не сохраняется в БД. Такой режим применяется для сохранения авторского права на интеллектуальную продукцию, которой и являются хранимые процедуры.
Исходные тексты разработанных хранимых процедур не должны быть доступны администратору базы данных заказчика. Однако все остальные параметры помимо имени хранимой процедуры являются необязательными. При этом процедуры могут быть и процедурами-функциями. Эти понятия трактуются здесь традиционно, как в языках программирования высокого уровня. Хранимая процедура-функция возвращает значение, которое присваивается переменной, определяющей имя процедуры. Явная процедура не возвращает значение, но в ней может быть использовано ключевое слово О1)ТР1)Т, определяющее, что данный параметр является выходным.
Рассмотрим несколько примеров простейших хранимых процедур. /* процедура проверки наличия экземпляров конкретной книги в библиотеке. Параметры: 61ЯВН, шифр книги, процедура возвращает параметр, равный числу экземпляров. Если возвращается нуль, это значит, что свободных экземпляров данной книги в библиотеке нет */ СИЕЛТЕ РКОСЕПЦВЕ СОПНТ ЕХ ((61ЯВН уагспаг (12)) ля /* определим внутреннюю переменную */ ВЕСЕЛЕЕ (6тЕК Сои)(т тпв /* выполним соответствующий оператор ЯЕьЕСТ, считая при этом только те экземпляры, которые в настоящий момент находятся в библиотеке */ ЯЕЪЕСТ 6ТЕК СОПНТ = зе1есГ соопс (*) ГНОМ ЕХЕМРьЛН ГНЕВЕ 1ЯВ)( = 61ЯВИ ЛНП НЕЛПЕН 61П 1а Н()ЬЬ ЛНВ ЕХТЯт = тгце 121 /* нуль означает, что ни одного свободного экземпляра данной книги в библиотеке нет */ НЕТРНМ 9ТЕК СОРМТ Хранимая процедура может быть вызвана несколькими способами.
Простейшим способом является использование оператора ЕХЕС: ЕХЕС <имя процедуры> <значение входного параметра1>... <имя переменной для выходного параметра 1>... При этом все входные и выходные параметры должны быть обязательно заданы в том порядке, в котором они определены в процедуре. Например, если надо найти число имеющихся в библиотеке экземпляров книги «Огас1е8. Энциклопедия пользователя» с 18ВХ 966-7393-08-09, текст вызова ранее созданной хранимой процедуры может быть следующим: /*Определим две переменные: 9МСеК вЂ” число экземпляров данной книги, имеющихся в наличии в библиотеке, и 91БВМ вЂ” международный шифр этой книги */ <)ес1аге 9МСеК 1пС РЕСЬАНЕ 91БВМ ЧАВСНАЕ(14) /* Присвоим значение переменной 91БВМ */ БЕЬЕСТ 91БВМ = 'Эбб-7393-08-09' /* Присвоим переменной 9МвеК результаты выполнения хранимой процедуры СОРМТ ЕХ */ ЕХЕС 9МСеК =СОРМТ ЕХ:2 91БВМ Если определены несколько версий хранимой процедуры, то при вызове можно указать номер конкретной версии для исполнения.
Например, во второй версии процедуры СО1ЛЧТ ЕХ последний оператор ее исполнения имеет следующий вид: ЕХЕС 9МСеК =СОУМТ ЕХ:2 91БВМ Однако если в процедуре определены значения входных параметров по умолчанию, то при ее запуске можно указывать значения не всех параметров. В этом случае оператор вызова процедуры можно записать в следующем виде: ЕХЕС <имя процедуры> <имя параметра1>=<значение параметра 1>... <имя параметран>=<значение параметраМ>...
Например, создадим процедуру, которая считает число книг, изданных конкретным издательством в конкретном году (при создании процедуры в качестве года издания по умолчанию зададим значение текущего года): 122 СКЕАТЕ РКОСЕППКЕ СООНТ ВООКБ (61ЕАК120 1пв = уеаг (СеСРаСе()). 6РРВЬ1СН чагсЬаг (20)) /* процедура подсчета числа книг конкретного издательства, изданных в конкретном году.
Параметры: 6УЕАК1БР 1пс — год издания и 6РУВь|СН вЂ” название издательства */ АБ РЕСЬАКЕ ОТЕК Соцпь 1пс БЕЬЕСТ 6ТЕК Сорос = БЕЬЕКТ СОРНТ (1БВН) РВОМ ВООКБ ХНЕКЕ УЕАК1ЕР =6УЕАК1ЕР АКР РПВЬ1СН = 6РОВь1СН /*Одновременно с исполнением оператора БЕЗВЕСТ результаты его выполнения присваиваются определенной ранее переменной 61ЬК Соцпс */ /* при формировании результата работы процедуры следует учесть, что в библиотеке, возможно, нет ни одной книги данного издательства заданного года. Результат выполнения запроса БЕьЕСТ в этом случае будет иметь неопределенное значение, однако анализировать все-таки лучше числовые значения, поэтому в качестве возвращаемого значения используют результаты работы специальной встроенной функции СОАЬЕБСЕ (п1, п2, ..., пш) языка Тгапвасс Б(2Ь, которая возвращает первое конкретное значение из списка значений п1, л2, ..., пш, т.
е. значение, не равное Ниль */ кетРкн сОАРВБсе (6тек соцпс, ()) Теперь вызовем эту процедуру, для чего подготовим переменную, в которую можно. поместить результаты ее выполнения: с(ес1аге 6Н 1пв Переменная РХ содержит число книг в библиотеке, изданных Издательским центром «Академия» в текущем году. Можно также обратиться к данной процедуре, задав все параметры: ехес 6н = сОРнт ВООкБ 6РРВБ1сн = 'Ак)ч(ения', 61елк1БР— 2004 В результате получим число книг, изданных Издательским центром «Академия» в 2004 г. и имеющихся в наличии в библиотеке. Задавая параметры по именам, необязательно использовать тот порядок, в котором они описаны при создании процедуры. Каждая хранимая процедура является объектом БД, т.е.
она имеет уникальное имя и уникальный внутренний номер в системном каталоге. При изменении текста хранимой процедуры следует сначала удалить ее как объект, хранимый в БД, и только после этого записать вместо нее новую процедуру. Отметим, что 123 при удалении хранимой процедуры удаляются одновременно все ее версии. Для того чтобы автоматизировать процесс удаления старой процедуры и замены ее новой, в начале текста хранимой процелуры можно выполнить проверку наличия объекта типа «хранимая процедура» с заданным именем в системном каталоге.