Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции БДиСУБД.docx
Скачиваний:
15
Добавлен:
19.11.2019
Размер:
494.91 Кб
Скачать

ОператорExecuteprocedure

Изхранимойпроцедурыилитриггераможновызватьдругуюхранимуюпроцедуру.Триггервызватьнельзя.Синтаксисвызовахранимойпроцедуры:

EXECUTEPROCEDURE<имя_процедуры>[<список_параметров>]

[RETURNING_VALUES:<список_переменных>]

Здесь<имя_процедуры>-имявызываемойпроцедуры

<список_параметров>-одинилинесколькопередаваемыхвпроцедурупараметров(необязательно,еслипроцедуранетребуетпараметров).Еслипараметровнесколько,ониразделяютсязапятыми.

<список_переменных>-однаилинескольколокальныхпеременныхиливыходныхпараметров,вкоторыепомещаютсярезультатыработывызываемойпроцедуры(необязательно,еслипроцедураневозвращаетзначения).Передименемкаждойпеременной(выходногопараметра)обязательноставитсядвоеточие,переменные(выходныепараметры)разделяютсязапятыми.

Исключения

ИсключениявInterBaseвомногомпохожинаисключениявязыкахвысокогоуровня.Исключение-этосообщениеобошибке,котороеимеетсобственноеуникальноеимяитекстсообщения.

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

CREATEEXCEPTION<имя><'сообщение'>;

Возьмем,кпримеру,самоераспространенноевязыкахпрограммированияисключение-делениенаноль.Создадимисключение:

CREATEEXCEPTIONno_del_null'Cannotdividebyzero!'

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

CREATEEXCEPTIONno_del_null'Нанольделитьнельзя!'

Далеевблокекодапроцедурыилитриггеравыможетевызватьэтоисключениеследующимобразом:

IF(delitel=0)THENBEGIN

EXCEPTIONno_del_null;

Resultat=0

END

ВданномпримереResultat-выходнойпараметрпроцедуры,вызвавшейисключение,аdelitel-входнойпараметр,которыймыпроверяемназначение0.

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

Исключениямогутбытьизмененыкомандой

ALTEREXCEPTION<имя_исключения><"новый_текст">

Приэтомневажно,сколькопроцедурилитриггеровиспользуютего:самоисключениеникуданеделось,изменилсялишьвыводимыйтекст

Исключениямогутбытьудаленыкомандой

DROPEXCEPTION<имя_исключения>

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

СобытияиоператорPost_event

ВхранимыхпроцедурахитриггерахсерверInterBaseпозволяетпосылатьзаинтересованнымклиентамизвещениеонаступлениикакого-либособытия.ДелаетсяэтокомандойPOST_EVENT:

POST_EVENT"Имя_события"

Пример:

POST_EVENT"Ups_Sorry"

Имясобытияможетбытьстрокойилитекстовойпеременной,содержащейимясобытия.

Клиентскаяпрограммадолжназарегистрироватьнасерверетесобытия,которыеееинтересуют,чтобыполучатьих.СделатьэтовклиентскомприложениипрощевсегоспомощьюкомпонентаTIBEventAlert,которыйнаходитсянавкладкеSamplesПалитрыкомпонентов,либоспомощьюкомпонентаTIBEvents,есливыдляработысБДпользуетеськомпонентамисвкладкиInterBase.

Сутьработысэтимикомпонентамипроста:

ВначалевсвойствеDatabaseвывыбираетекомпонентбазыданных,напримерTDatabaseилиTIBDatabase,взависимостиоттого,какиммеханизмомдоступакБДвыпользуетесь.Компонентбазыданныхдолженбытьподключенксерверу(подробнееобэтомвследующихлекциях).

ДалеевыдваждыщелкаетепосвойствуEvents,котороеимееттипTStrings,ивоткрывшемсяспискевписываетеинтересующиевассобытия.

ЗатемвыпереводитесвойствоRegisteredвTrue.

ПотомтребуетсяперейтинавкладкуEventsинспектораобъектовисгенерироватьсобытиеOnEventAlert,вкоторомможетенаписатькакое-либосообщениеилидействие.ПараметрEventNameбудетсодержатьимяслучившегосясобытия.Например:

IfEventAlert='Ups_Sorry'then

ShowMessage('Извините,ноктотоудалилвашузапись!');

ПараметрEventCountсодержитколичествособытий,произошедшихнасервере,аизменяемыйпараметрCancelAlertsпозволяетотказатьсяотвыдачидальнейшихсообщений,дляэтогонужноприсвоитьемузначениеTrue.