
Лаб_20 Головков И.Е. 12002108 УД
.docxФЕДЕРАЛЬНОЕ Государственное АВТОНОМНОЕ образовательное УЧРЕЖДЕНИЕ ВЫСШЕГО образования
«БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ
ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ»
(НИУ «БелГУ»)
ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ
Кафедра прикладной информатики и информационных технологий
Отчет по лабораторной работе № 20
Тема работы «Разработка бизнес-логики на стороне SQL-сервера»
по дисциплине «Управление данными»
студента очного отделения
2 курса 12002108 группы
Головкова Игоря Евгеньевича
Проверил:
Ассистент кафедры прикладной информатики и информационных технологий Сухарев М. А.
БЕЛГОРОД, 2023
Цель работы
1. Создать модифицируемые и не модифицируемые представления (не менее 5) в базе данных (полученной при выполнении предыдущих лабораторных работ), при этом необходимо:
· Выполнить запросы к таблицам БД.
· Выполнить объединения данных.
· Создать псевдонимы.
· Выполнить группировку и упорядочение данных.
· Использовать в SQL-запросах агрегатные функции.
2. Создать хранимые процедуры:
Хранимые процедуры выполнения (не менее 3), для ввода, модификации и удаления информации в таблицах БД.
Хранимые процедуры выборки (не менее 5).
3. Создать необходимые исключения (не менее 2 исключений).
4. Создать генераторы и триггеры для реализации бизнес-логики (не менее 3 триггеров). При разработке триггеров обязательно использовать индикаторы фазы: BEFORE и AFTER , индикаторы события DML: DELETE, INSERT, UPDATE и логические контекстные переменные INSERTING и DELETING
5. Подготовить отчет о проделанной работе.
1. Создание представлений
CREATE VIEW ferns(id, name, name_latin, life_form) AS SELECT pi.id, pi.name, pi.name_latin, lf.life_form FROM plant_information pi LEFT JOIN life_forms lf ON pi.life_form_id = lf.id WHERE lf.life_form = 'Папоротник'::text;
CREATE VIEW high_plants(plant_id, planting_date, height_cm, blooming) AS SELECT physical_parameters.plant_id, physical_parameters.planting_date, physical_parameters.height_cm, physical_parameters.blooming FROM physical_parameters WHERE physical_parameters.height_cm > 80 with cascaded check option;
CREATE VIEW plant_info_usable(id, name, name_latin, family, life_form, toxicity) AS SELECT pi.id, pi.name, pi.name_latin, f.family, lf.life_form, t.toxicity FROM plant_information pi LEFT JOIN families f ON f.id = pi.id LEFT JOIN life_forms lf ON pi.life_form_id = lf.id LEFT JOIN toxicity t ON pi.toxicity_id = t.id;
CREATE VIEW plant_names(id, name, name_latin) AS SELECT plant_information.id, plant_information.name, plant_information.name_latin FROM plant_information WHERE plant_information.id > 0 with cascaded check option;
CREATE VIEW trees(id, name, name_latin, life_form) AS SELECT pi.id, pi.name, pi.name_latin, lf.life_form FROM plant_information pi LEFT JOIN life_forms lf ON pi.life_form_id = lf.id WHERE lf.life_form = 'Дерево'::text;
CREATE VIEW plants_amount(name, count) as SELECT plant_information.name, count(plant_information.id) AS count FROM plant_information GROUP BY plant_information.name;
CREATE VIEW physical_param_usable(plant_id, planting_date, height_cm, blooming) AS SELECT physical_parameters.plant_id, to_char(physical_parameters.planting_date::timestamp with time zone, 'dd-mm-yyyy'::text) AS planting_date, physical_parameters.height_cm, physical_parameters.blooming FROM physical_parameters with cascaded check option;
Представление
растений с заменой id
на соответствующее название
2. Создание хранимых процедур
Хранимые процедуры выполнения (не менее 3), для ввода, модификации и удаления информации в таблицах БД.
Модификация
CREATE OR REPLACE PROCEDURE refresh_age() language plpgsql as $$ BEGIN UPDATE physical_parameters SET planting_date = planting_date; END $$;
Вставка
CREATE OR REPLACE PROCEDURE clone_last_plant_of_plant_info() language plpgsql AS $$ DECLARE plant_id int; name1 text; name2 text; fid int; lfid int; toxid int; BEGIN SELECT id FROM plant_info ORDER BY id DESC LIMIT 1 INTO plant_id; plant_id = plant_id+1; SELECT name FROM plant_info ORDER BY id DESC LIMIT 1 INTO name1; SELECT name_latin FROM plant_info ORDER BY id DESC LIMIT 1 INTO name2; SELECT family_id FROM plant_info ORDER BY id DESC LIMIT 1 INTO fid; SELECT life_form_id FROM plant_info ORDER BY id DESC LIMIT 1 INTO lfid; SELECT toxicity_id FROM plant_info ORDER BY id DESC LIMIT 1 INTO toxid; INSERT INTO plant_info(id, name, name_latin, family_id, life_form_id, toxicity_id) VALUES (plant_id, name1, name2, fid, lfid, toxid); END $$;
Удаление
create PROCEDURE delete_last_plant_of_plant_info() language plpgsql as $$ DECLARE last_plant_id int; BEGIN SELECT id FROM plant_info ORDER BY id DESC LIMIT 1 INTO last_plant_id; DELETE FROM physical_parameters WHERE plant_id = last_plant_id; DELETE FROM plant_health WHERE plant_id = last_plant_id; DELETE FROM plant_info WHERE id = last_plant_id ; END $$;
3. Создание триггеров
1) create or replace function count_age() returns trigger language plpgsql as $$ DECLARE dd int; BEGIN dd = now()::date - new.planting_date::date; UPDATE physical_parameters SET age_days = dd WHERE new.planting_date = physical_parameters.planting_date; RETURN NEW; END $$; CREATE OR REPLACE TRIGGER counting_age AFTER INSERT OR UPDATE OF planting_date ON physical_parameters FOR EACH ROW EXECUTE FUNCTION count_age();
2)
create function add_plant_to_physical_parameters() returns trigger language plpgsql as $$ DECLARE maximum integer; BEGIN maximum = MAX(id) FROM plant_info; INSERT INTO physical_parameters(plant_id) VALUES (maximum); RETURN NEW; END $$;
create trigger adding_plant_to_physical_parameters after insert on plant_info execute procedure add_plant_to_physical_parameters();
3)
create function add_plant_to_plant_health() returns trigger language plpgsql as $$ DECLARE maximum integer; BEGIN maximum = MAX(id) FROM plant_info; INSERT INTO plant_health(plant_id) VALUES (maximum); RETURN NEW; END $$; alter function add_plant_to_plant_health() owner to postgres;
create trigger adding_plant_to_plant_health after insert on plant_info execute procedure add_plant_to_plant_health();
До срабатывания триггера обновления количества днейh:
После вызова SELECT refresh_age():
4. Обработка исключения
CREATE
OR REPLACE PROCEDURE exchandling()
AS
$$
DECLARE
x int;
BEGIN
x = 100 /
0;
EXCEPTION
WHEN division_by_zero THEN
RAISE NOTICE 'перехватили
ошибку
деления
на
ноль';
END;
$$
LANGUAGE plpgsql;
CALL exchandling();