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

Если хранимая процедура выполняет действие, но не возвращает значений или возвращает 1-ну строку

Если хранимая процедура выполняет действие, но не возвращает значений или возвращает 1-ну строку, то можно использовать:

  • компонент TStoredProc;

  • компонент TQuery.

Рассмотрим, для примера, процедуру, которая выполняет оператор Insert.

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

Пример вызова хранимой процедуры с помощью компонента TStoredProc:

DB.StartTransaction; //старт транзакции

with StoredProc1 do

try

StoredProcName := 'InsNakl';

//Подготовка параметров

Prepare;

ParamByName('pname').AsString := Edit1.Text;

ParamByName('pauthor').AsString := Edit2.Text;

ExecProc;

Close;

DB.Commit; //если все хорошо

except

DB.Rollback; //если ошибка

end;

Пример вызова хранимой процедуры с помощью компонента TQuery:

DB.StartTransaction; //старт транзакции

with Query1. do

begin

SQL.Clear;

//Вызов хранимой процедуры InsNakl с несколькими параметрами

SQL.Add('EXECUTE PROCEDURE InsNakl (:pname, :pauthor, …)');

//занесение параметров

ParamByName('pname').AsString := Edit1.Text;

ParamByName('pauthor').AsString := Edit2.Text;

try

ExecSql;

Close;

DB.Commit; //если все хорошо

except

DB.Rollback; //если ошибка

end;

Если хранимая процедура возвращаетнесколькострок

Если хранимая процедура возвращает несколько строк, то можно использовать только компонент TQuery. Например, для процедурыBooksполучим:

DB.StartTransaction; //старт транзакции

with Query1. do

begin

SQL.Clear;

//Вызов хранимой процедуры Books с 1-м входным параметром

SQL.Add('SELECT * FROM Books(:ppublish)');

//занесение параметров

ParamByName('ppublish').asString := Edit1.Text;

try

ExecSql;

Close;

DB.Commit; //если все хорошо

except

DB.Rollback; //если ошибка

end;

Примечание. Следует подчеркнуть, что в операторе SELECT список параметров задается символом "*".

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

Query1.Fields[0].AsString;

StoredProc1.Fields[0].AsString

или по имени, если вы его знаете, например

Query1.FieldByName('pname').asString;

StoredProc1.FieldByName('pname').asString;

    1. Триггеры

Триггер (trigger) представляет собой процедуру особого типа, которая вызывается автоматически при модификации записей БД, т. е. при изменении значений столбцов или при их удалении и добавлении. Фактически триггеры являются разновидностью хранимых процедур, но пользователю они не доступны, а доступны только БД.

Запуск триггера обусловлен наступлением определенного события (действия) — по сути, добавления INSERT или удаления DELETE строки в заданной таблице, а так же при модификации UPDATE данных в определенном столбце заданной таблицы БД.

Момент запуска триггера определяется с помощью ключевых слов BEFORE, когда триггер запускается до выполнения связанного с ним события, например, до добавления записи, или AFTER, когда триггер запускается до выполнения связанного с ним события. В случае, если триггер вызывается до наступления события, он может внести изменения в модифицируемую событием запись, конечно, при условии, что событие — не удаление записи.

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

Триггер – поименованный объект БД, который ассоциирован с таблицей и активируется при наступлении определенного события, связанного с этой таблицей. Триггер запускается сервером БД автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции.

Создание триггера подобно для многих СУБД. Покажем это на примереСУБД InterBase:

CREATE TRIGGER <Имя триггера> FOR <Имя таблицы>

[active | inactive]

{before | after}

{update | insert | delete}

[position <Число>]

AS <Тело триггера>

Описатели activeиinactiveопределяет активность триггера стразу после его создания. По умолчанию действуетactive.

Описатели beforeиafterзадают момент начала выполнения триггера.

Описатели update, insertиdeleteопределяют момент (событие) выполнения триггера.

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

Триггер можно удалить оператором DROP TRIGGER <Имя триггера>

Изменяется триггер оператором ALTER TRIGGER <Имя триггера>

Программирование триггера ничем не отличается от программирования хранимых процедур. Например:

CREATE TRIGGER Table_example_bi FOR Nakls

ACTIVE BEFORE INSERT POSITION 0

as

begin

if (NPrice IS NULL) then

NPrice = 0.0;

end

Отметим, что для доступа к значениям столбца используются конструкции формата:

old.<Имя столбца> /*Обращение к старому значению*/

new.<Имя столбца> /*Обращение к новому значению*/