
Лабораторные работы БД / Лабораторная 10. Хранимые процедуры
.docХранимые процедуры
1.
БД |
«Аналог» приложения на языке программирования Borland Delphi |
База данных |
Приложение |
Таблица поле таблицы триггер |
Объект свойство объекта событие объекта |
Хранимая процедура |
Глобальная процедура приложения |
2. Общий синтаксис создания хранимой процедуры
CREATE PROC[EDURE] <Имя_процедуры>
[@<Имя_параметра> <Тип_данных_параметра>
[ = <Значение_параметра_по_умолчанию>]
[OUTPUT]] [ ,...n ]
AS <SQL-выражения, составляющие тело процедуры>
3. Примеры
--3.1. Хранимая процедура, возвращающая сведения о поставках деталей
CREATE PROCEDURE sp_supplies
AS
SELECT supplier_name, detail_name, supply.supply_quantity, supply_date
FROM supply JOIN supplier ON supply.supplier_id = supplier.supplier_id
JOIN detail ON supply.detail_id = detail.detail_id
--Вызов процедуры sp_supplies:
EXECUTE sp_supplies
--3.2. Хранимая процедура, возвращающая сведения о поставках деталей за определенный интервал времени
CREATE PROCEDURE sp_date_supplies @start DATETIME, @end DATETIME
AS
SELECT supplier_name, detail_name, supply.supply_quantity, supply_date
FROM supply JOIN supplier ON supply.supplier_id = supplier.supplier_id
JOIN detail ON supply.detail_id = detail.detail_id
WHERE supply_date BETWEEN @start AND @end
--Вызов процедуры sp_date_supplies:
EXEC sp_date_supplies '01.01.2008', '17.11.2008'
--или
EXEC sp_date_supplies @end = '17.11.2008', @start = '01.01.2008'
--3.3. Процедура, добавляющая сведения в таблицу деталей
CREATE PROC sp_add_detail
@name VARCHAR (50) = 'Не задано',
@weight NUMERIC (10, 2),
@mat_id INT
AS
INSERT INTO detail (detail_name, weight, material_id)
VALUES (@name, @weight, @mat_id)
--Вызов процедуры sp_add_detail:
EXEC sp_add_detail 'Подшипник', 120, 2
--или
EXEC sp_add_detail @weight = 0.2, @mat_id = 1
--3.4. Процедура, возвращающая название материала, из которого изготовлено больше всего деталей
CREATE PROCEDURE most_popular_material
@name VARCHAR (50) OUTPUT,
@quantity INT OUTPUT
AS
SELECT @name = material_name, @quantity = COUNT (detail_id)
FROM material m JOIN detail d
ON m.material_id = d.material_id
GROUP BY material_name
ORDER BY COUNT (detail_id)
--Вызов процедуры most_popular_material:
DECLARE @material VARCHAR (50),
@quantity INT
EXEC most_popular_material
@name = @material OUTPUT,
@quantity = @quantity OUTPUT
SELECT 'Большинство деталей (' + CAST (@quantity AS VARCHAR) + ' шт.) сделано из материала ' + @material
GO
--3.5. Процедура, реализующая функцию каскадного удаления на связь между таблицами материалов и деталей
CREATE PROC sp_delete_material @material_id INT
AS
IF (NOT EXISTS (SELECT * FROM detail WHERE material_id = @material_id))
BEGIN
DELETE FROM material WHERE material_id = @material_id
RETURN (0)
END
ELSE
BEGIN
DELETE FROM detail WHERE material_id = material_id
IF (@@ERROR = 0)
BEGIN
DELETE FROM material WHERE material_id = @material_id
RETURN (0)
END
ELSE RETURN (1)
END
--Вызов процедуры sp_delete_material:
DECLARE @result INT
EXEC @result = sp_delete_material 6
IF @result = 0
PRINT 'Материал удален успешно'
ELSE
PRINT 'Не получилось :('
GO