Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Proektirovanie_BD_v_Delphi_VTiP.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.82 Mб
Скачать

6.3Вызов хранимых процедур

Если хранимая процедура выполняет действие, но не возвращает значений или возвращает 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;

6.4Триггеры

Триггер (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.<Имя столбца> /*Обращение к новому значению*/

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]