Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в СУБД HyTech.doc
Скачиваний:
11
Добавлен:
01.03.2025
Размер:
2.67 Mб
Скачать

Удаление триггера

SQL оператор drop trigger удаляет существующий триггер. Удаляемый триггер задается своим именем.

Формат:

drop trigger Имя_триггера [ cascade | restrict ];

Аргументы:

Аргумент

Значение

Имя_триггера

Задает имя удаляемого триггера. Триггер с указанным именем должен быть создан оператором create trigger.

cascade

Если задано ключевое слово cascade, то при удалении триггера удалятся и все связанные с ним объекты. В текущей реализации таких объектов нет.

restrict

Если указано ключевое слово restrict и есть связанные с ним объекты, то операция завершится с ошибкой.

Пример:

Удалить триггер tadBOOK со всеми объектами.

drop trigger tadBOOK cascade;

4.7 Совместное использование sql запросов и процедурных расширений Совместное использование sql-запросов и процедурных расширений

Проиллюстрируем совместное использование SQL-запросов и процедурных расширений следующими основными приемами:

  • Передача переменных в качестве параметра в SQL-запрос;

  • Сохранение результата запроса в переменной;

  • Использование результата, сохраненного в переменной, в других запросах;

  • Чтение результата запроса;

  • Использование в триггерах переменных old и new;

  • Проверка ошибок триггера.

Передача переменных в качестве параметра в sql-запрос

Выполним запрос с переменными в качестве параметров:

var @nYear = 2004, @Name = 'Метель'; select * from BOOK where PYEAR = @nYear or NAME = @Name;

Для указания переменных в качестве параметра в теле запроса перед именем операнда используется @.

Сохранение результата запроса в переменной

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

Пример 1. Сохранение результата обычного запроса.

// резервируем переменную для результата var @hc = CursAlloc(); // выполняем запрос select * from READER where LNAME like 'П*ро*'; // получаем Sab и сохраняем его в выделенной переменной SabToCurs(@hc, SabFromCurs(ThisCurs())); // освободить курсор CursFree(@hc);

Пример 2. Сохранение результата динамического SQL.

// резервируем переменную для результата var @hc = CursAlloc(); var @q; q = 'PYEAR > 1996'; // выполняем запрос, в переменную hc сохраняем результат execute immediate 'select * from BOOK where '+@q+';\n'+   'SabToCurs('+@hc+', SabFromCurs(ThisCurs()));'; // не будем освобождать курсор, используем его в следующем примере

Использование результата запроса Использование результата, сохраненного в переменной, в других запросах

Примеры:

var @hc = CursAlloc(); select * from BOOK where PYEAR < 2006; SabToCurs(@hc, SabFromCurs(ThisCurs())); select * from BOOK where cursno @hc and NAME like '*и*';

Чтение результата запроса

Далее рассмотрим чтение результата запроса.

В первом примере переменная @i получит значение равное 2008.

var @i = 0; select @i = PYEAR as X from BOOK order by ID;

Выводим значение @i:

select @i as I from BOOK where ID = 1;

Значение переменной присваивается на каждой строке, а в последней строке содержится значение 1996.

Во втором примере в строке @names накапливается значение:

// Функция iif - условное выражение. // Если первый аргумент не равен нулю, то функция iif // возвращает второй аргумент, если равен нулю - третий. var @names = '', @cnt = 0; select @cnt = count(*) from (   select     @names = iif(recno == 0, '', @names +                  iif(@names != '', ',', '') +                  NAME)   from BOOK );

Выводим значение @names:

select @names as NAMES from BOOK;

В результате @names содержит строку: «Мертвые души, Ревизор, Шинель, Капитанская дочка, Метель, Барышня-крестьянка, Мцыри, Песня про купца Калашникова».

Приведем другой вариант вычисления @names с использованием хранимой процедуры. Создаем процедуру:

// Если процедура scBNames существует // раскомментируйте: // drop procedure scBNames; create procedure scBNames(nBook, names inout) as   declare variable @name1 = ''; begin   select     @name1 = NAME   from     BOOK   where     ID = @nBook;     @names = @names + @name1;   return @names; end;

Вычисляем значение @names путем вызова процедуры на каждой строке результирующего запроса:

var @names = '';

select scBNames(ID, @names) from BOOK;

В результате @names содержит строку: «МертвыедушиРевизорШинельКапитанская дочкаМетельБарышня-крестьянкаМцыриПесня про купца Калашникова».