Слайд 1Основы применения языка SQL
Хранимые процедуры, функции и триггеры.
Автор: к.т.н. Герасимов Н.А.
Слайд 28.1. Хранимые процедуры
Процедуры и функции являются специальными подпрограммами, которые можно многократно
использовать. Они хранятся на стороне сервера и к ним можно иметь доступ со стороны клиента.
Преимущество создания Хранимых процедур:
- при обращении к процедуре не нужно писать весь текст SQL-запроса
Процедуры являются общим инструментом
Не требуется предварительного синтаксического анализа SQL-запроса
Слайд 3Синтаксис хранимой процедуры
CREATE PROCEDURE
/* Список входных параметров */
RETURNS
/* Список
выходных параметров */
AS
/* Начало тела процедуры */
/* Объявление переменных */
DECLARE VARIABLE <имя перем.><тип перем.>
/*Исполнительная часть */
BEGIN
Оператор 1;
Оператор 2;
END;
Слайд 4Выполнение процедуры
execute [( < параметры > )]
Слайд 5Переменные
Переменная определяется выражением
DECLARE
Присвоение значения переменной
SET =значение;
Пример:
DECLARE vname character(25);
SET
vname=“Иванов”;
SET vname=SELECT S_NAME FROM Customers WHERE C_KOD=“00001”;
Слайд 6Пример процедуры
Создание процедуры, которая изменяет значение в столбце cours в таблице
PREDMET
CREATE PROC new_course
AS update PREDMET
set cours=cours+1.
Исполнение процедуры
EXEC new_course
Слайд 7Процедура со входными переменными
Пусть заданы: коэффициент индексации (@KF_INDEX) и
сумма стипендии, которая индексируется (@FOR_SUM)
Создание процедуры:
CREATE proc IND_STIP_KF (@KF_INDEX real, @FOR_SUM decimal)
AS
UPDATE STUDENT
SET STIP = STIP*@KF_INDEX
WHERE STIP <= @FOR_SUM
Выполнение процедуры с конкретными значениями индексации :
EXEC IND_STIP_KF @KF_INDEX=1.2, @FOR_SUM=35;
Слайд 8Использование условных операторов в процедурах
Структура условного выражения:
IF
Операторы
[ELSE]
[IF <выражение 2>]
операторы
Слайд 9Пример процедуры индексирования стипендии
Проиндексировать конкретного (задан номер) студента
в том случае, если этот студент посещал определенные занятия (номер предмета).
CREATE PROC IND_STIP_PRED ( @SNUM_ST CHAR(4),
@PNUM_PR CHAR(4), @IND_KF DECIMAL )
AS
IF EXISTS (SELECT SNUM, PNUM FROM USP
WHERE SNUM=@SNUM_ST AND PNUM=@PNUM_PR)
BEGIN
UPDATE STUDETN
SET STIP=STIP*@IND_KF
WHERE SNUM=@SNUM_ST
END
Слайд 10Вывод сообщений на экран
PRINT
Присвоение значения
SELECT =
Пример. Присвоить
значение переменой @X и вывести на экран сообщение о ее значении переменной
SELECT @X=10
PRINT 'Установлен уровень='
PRINT @X
Слайд 11Циклическое выполнение операций
WHILE
[Операторы]
или
FOR … DO … END FOR;
Слайд 12Пример организации цикла
Создать процедуру вычисления значения переменной (@X) в цикле.
CREATE PROC
TEST
AS
DECLARE @X INT
DECLARE @I INT
SELECT @I=1
SELECT @X=1
WHILE @I<=100
BEGIN
SELECT @X=@X*2
PRINT 'I+'
PRINT @I
SELECT @I=@I+1
END
Слайд 13Организация «ветвлений» в процедуре
Написать процедуру, которая проверяет входную переменную (@N) и
выдает соответствующее значение из таблицы.
CREATE PROC TEST_INT @N INT
AS
BEGIN
DECLARE @X DECIMAL(9,2)
SELECT @X=
CASE @N
WHEN 1 THEN 20.1
WHEN 2 THEN 30.54
WHEN 3 THEN 70
ELSE 0
END
PRINT 'Установлен уровень='
PRINT @X
END
Слайд 14Использование системных переменных (@@)
Создать процедуру для выдачи информации о локальном сервере
CREATE PROC NAME_LOCAL_SERVER
AS
PRINT 'Имя локального сервера :'
PRINT @@SERVERNAME
Запуск процедуры
EXEC NAME_LOCAL_SERVER
Имя локального сервера :
BENQ-C9CAB32B6C
Слайд 17Функции
Функции похожи на процедуры и используют те же операторы
Функции могут возвращать
переменные (RETURN)
Функции можно использовать в SQL-операторах
Слайд 18Пример создания функции
Функция создает список товаров, которые купил покупатель с кодом
C_KOD и возвращает его в виде списка
CREATE FUNCTION prodduct (@_C_KOD)
RETURNS prod CHAR VARING(400
BEGIN
DECLARE prod CHAR VARNYING(400)
DEFAULT ‘’;
DECLARE x ROW;
FOR x AS SELECT * FROM Orders as T
WHERE T.C_KOD=@C_KOD
DO
IF x.Name <> “”
THEN SET prod=prod || ‘, ‘;
END IF;
SET prod=prod || x.Name;
END FOR;
RETURN prod;
END;
Слайд 19Триггеры
Это автоматически выполняемый процедурный код.
Что дает их применение:
- поддержка ссылочной
целостности
- автоматизация некоторых важных работ с данными
- обновление таблиц
- вызов хранимых процедур
Слайд 20Инициализация триггера
События вызывающие инициализацию:
- до и после вставки, выбора или удаления
строки данных
- триггер связан с таблицей
Синтаксис создания триггера
CREATE TRIGGER <имя триггера > FOR <имя таблицы>
[ACTIVATE | INACTIVATE] (BRFORE | AFTE) (UPDATE | INSERT | DELETE)
AS
BEGIN
тело триггера
END
Удаление триггера
DROP <имя триггера >
Слайд 21Пример триггера
Создать триггер, который выполняет каскадное удаление в таблице SES_RES при
удалении записи в таблице STUDENTS
CREASTE TRIGGER deletion FOR students
ACTIVATE AFTE DELETE
AS
BEGIN
DELETE FROM ses_res
WHERE ses_res.ST_ID=studerts.ST_ID;
END;
Слайд 22Создание генераторов
Генераторы обеспечивают создание для таблиц автоинктементного типа данных (счетчики)
CREATE GENERATOR
<имя генератора>
SET GENERATOR <имя генератора> TO <начальное значение>
Обращение к генератору
GET_ID(< имя генератора >)