Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектирование БД в Delphi ВТиП.doc
Скачиваний:
53
Добавлен:
17.03.2016
Размер:
3.62 Mб
Скачать
    1. Обзор событий компонентаtQuery

Все запросы – точнее их НД, получают в свое распоряжение большое количество событий, унаследованных ими от родительского класса TBDEDataSet. Это те же события, что и для НД на основе таблиц.

Рисунок 4.55 –Состав событий набора данных TQuery

К наиболее важным событиям относятся события, связанные с реализацией каскадных изменений и бизнес-правил, а также ряд других событий.

Для реализации каскадных изменений и бизнес-правил в локальных или файл-серверных БД обычно используются обработчики событий AfterXXXX и BefогеХХХХ.

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

Каскадные изменения и бизнес-правила связаны с изменениями НД (вставка, удаление или редактирование записи) и отличаются тем, что события BefогеХХХХ наступают непосредственно перед изменением НД, а события AfterXXXX - сразу после изменения.

Обработчики этих событий в качестве параметра получают ссылку на запрос и его НД, вызвавший соответствующее событие. Если необходимо прервать работу обработчика и предотвратить изменение таблиц БД, нужно возбудить исключение или вызвать процедуру Abort.

Безусловным достоинством реализации каскадных изменений и бизнес-правил именно в обработчиках этих событий является концентрация их в одном месте - модуле данных, (если, разумеется, все компоненты-наборы сосредоточены в едином модуле данных), что облегчает программисту их отслеживание и внесение в них необходимых изменений.

К другим событиям можно отнести события:

  • OnCalcFields, которое возникает в момент, когда программа должна сформировать значения для вычисляемых полей;

  • OnNewRecord, которое возникает при вставке новой записи.

  1. Хранимые процедуры и триггеры

    1. Хранимые процедуры

Хранимая процедура (Stored Procedure) — объект БД, представляющий собой набор SQL-инструкций, который компилируется один раз и хранится на клиент-сервере.

Хранимые процедуры очень похожи на обыкновенные процедуры языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам. В хранимых процедурах могут выполняться стандартные операции с БД, как описания данных, так и манипулирования данными. Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления потоком.

Хранимые процедуры существуют независимо от таблиц или каких-либо других объектов БД. Они вызываются клиентской программой, другой хранимой процедурой или триггером. Разработчик может управлять правами доступа к хранимой процедуре, разрешая или запрещая ее выполнение.

В большинстве СУБД при первом запуске хранимой процедуры она компилируется и в дальнейшем её обработка осуществляется быстрее.

    1. Создание хранимых процедур

Очень толково http://www.ibase.ru/devinfo/sp_call.htm

Для иллюстрации реальных возможностей использования хранимых процедур используем СУБД InterBase. Синтаксис описания хранимых процедур подобен и для большинстваСУБД и имеет вид:

CREATE PROCEDURE

<Имя процедуры> [(<Список входных параметров>)]

[RETURNS (<Список выходных параметров>)]

AS <Тело процедуры>

Список параметров выглядит так:

<Имя параметра> <Тип параметра> [,<Имя параметра> <Тип параметра>]

При использовании параметра в выражениях тела процедуры перед его именем нужно указывать знак ":".

Тело процедуры состоит из двух частей – объявления переменных и исполнительной.

Объявление переменных:

declare variable <Имя переменной> <Тип переменной>;

Тип переменной совпадает с типом столбцов БД.

Исполнительная часть:

begin

<Оператор1>

<Операторn>

end

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

Пример. Процедура имеет ряд входных параметров и не возвращает параметров:

CREATE PROCEDURE InsNakl (pname varchar(20), pauthor varchar(20), …)

as

begin

INSERT BName, BAuthor, … INTO Nakls VALUES (:pname, :pauthor, …)

end

Специальный интерес представляет оператор SELECT. Различают2-а вида оператораSELECT.

Оператор выбора одной строкиSELECT,который возвращает одну строку. Значение столбцов возвращаемой строки присваиваются указанным переменным или параметрам.

Пример. Процедура возвращает одну строку из двух параметров:

CREATE PROCEDURE Payed

returns (psum float, pavg float) /*Выходные параметры*/

as

begin

SELECT sum(NSum), avg(NSum)

FROM Nakls

INTO :psum, :pavg; /*Запись в параметры*/

end

Оператор выбора нескольких строкFOR SELECT … DO, способный возвращать несколько строк:

for <Оператор выбора строки> do <Оператор>;

Пример. Обработка возвращаемых строк выполняется внутри процедуры. Но из процедуры строки не возвращаются:

CREATE PROCEDURE CountNakl

returns (psum integer)

as

declare variable n integer;

declare variable x integer;

begin

x = 0;

for SELECT NaklID FROM Nakls INTO :n do

x = x + 1;

:psum = x;

end

end

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

Пример: Процедура возвращает строки.

CREATE PROCEDURE books (ppublish varchar(20))

returns (pname varchar(20), pauthor varchar(20))

as

begin

for SELECT BName, BAuthor

FROM Books

WHERE BPablish= : ppublish

INTO :pname; :pauthor

do suspend;

end

Ключевым в работе процедуры является указание suspend. В тот момент, когда выполнение процедуры доходит доsuspend, сервер останавливает выполнение процедуры, и ожидает, пока клиент не запопросит получение данных из процедуры. После получения данных (одной строки) сервер прокрутит следующий циклfor select doдо очередногоsuspend, и так далее, пока клиент не перестанет запрашивать строки, или пока строки в запросе не кончатся.

Из процедуры можно вызвать так же другую процедуру при помощи оператора execute procedure:

execute procedure <Имя процедуры> [(<Список входных параметров>)]

[returning_values (<Список выходных параметров>)]

Пример:

CREATE PROCEDURE ptest

returns (opresult float)

as

begin

execute procedure pdivide (100, 20) returning_values (opresult);

end

Хранимую процедуруможно удалить оператором

DROP PROCEDURE <Имя процедуры>

Изменяется хранимая процедураоператором

ALTER PROCEDURE <Имя процедуры>