Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб_20 Головков И.Е. 12002108 УД

.docx
Скачиваний:
0
Добавлен:
26.06.2024
Размер:
292.72 Кб
Скачать

ФЕДЕРАЛЬНОЕ Государственное АВТОНОМНОЕ образовательное УЧРЕЖДЕНИЕ ВЫСШЕГО образования

«БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ

ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ»

(НИУ «БелГУ»)

ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ

Кафедра прикладной информатики и информационных технологий

Отчет по лабораторной работе № 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),  для ввода, модификации и удаления информации в таблицах БД.

  1. Модификация

CREATE OR REPLACE PROCEDURE refresh_age() language plpgsql as $$ BEGIN UPDATE physical_parameters SET planting_date = planting_date; END $$;

  1. Вставка

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 $$;

  1. Удаление

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();