
отчеты по лабам / СУБД_ЛР6
.docxОтчет по ЛР № 6
Практическая часть
Задание 1
Напишите запрос по варианту
№ |
Условие запроса |
3 |
Напишите скрипт, выводящий количество всех оценок 5, 4, 3, 2 в единой таблице |
do
$$
DECLARE
num_of_5 INTEGER;
num_of_4 INTEGER;
num_of_3 INTEGER;
num_of_2 INTEGER;
BEGIN
SELECT COUNT(CASE WHEN mark=5 THEN 1 END)
INTO num_of_5
FROM field_comprehension;
raise notice 'Mark 5: %', num_of_5;
SELECT COUNT(CASE WHEN mark=4 THEN 1 END)
INTO num_of_4
FROM field_comprehension;
raise notice 'Mark 4: %', num_of_4;
SELECT COUNT(CASE WHEN mark=3 THEN 1 END)
INTO num_of_3
FROM field_comprehension;
raise notice 'Mark 3: %', num_of_3;
SELECT COUNT(CASE WHEN mark=2 THEN 1 END)
INTO num_of_2
FROM field_comprehension;
raise notice 'Mark 2: %', num_of_2;
END
$$;
Задание 2
Напишите запрос по варианту
№ |
Условие запроса |
3 |
Создайте процедуру добавления нового преподавателя |
CREATE PROCEDURE add_proffesor(professor_id bigint, surname char(30), name char(30), patronymic char(30), degree varchar(15), academic_title varchar(40), сurrent_position varchar(40),
experience integer, salary money, phone varchar(30), structural_unit_number integer,
contract_number integer, wage_rate numeric(3,2))
LANGUAGE SQL
AS $$
INSERT INTO professor (professor_id, surname, name, patronymic, degree, academic_title, сurrent_position, experience, salary, phone_number)
VALUES (77777, 'Александр', 'Волков', 'Сергеевич', 'д.т.н.', 'профессор', 'доцент', 10, 500000::money, '8(800)555-35-35');
INSERT INTO employment (structural_unit_number, professor_id, contract_number, wage_rate)
VALUES (1, 77777, 111111, 0.75);
$$;
Задание 3
Напишите запрос по варианту
№ |
Условие запроса |
3 |
Сделайте функцию, которая выводит всю информацию о преподавателе по его id |
CREATE OR REPLACE FUNCTION find_professor(professor_id bigint) RETURNS table (
professor_id INTEGER,
surname TEXT,
name TEXT,
patronymic TEXT,
degree TEXT,
academic_title TEXT,
Сurrent_position TEXT,
experience INTEGER,
salary MONEY,
phone TEXT
)
LANGUAGE SQL
AS $$
SELECT *
FROM professor
WHERE professor_id = professor_id
$$;
----------------------------
SELECT find_professor(81001)
Задание 4
Напишите запрос по варианту
№ |
Условие запроса |
3 |
Создайте процедуру удаления преподавателя |
CREATE PROCEDURE del_professor(professor_id_del bigint)
LANGUAGE SQL
AS $$
DELETE FROM employment WHERE professor_id = professor_id_del;
DELETE FROM professor_field WHERE professor_id = professor_id_del;
UPDATE field SET professor_id=81001 WHERE professor_id = professor_id_del;
DELETE FROM professor WHERE professor_id = professor_id_del;
$$;
Задание 5
Напишите запрос по варианту
№ |
Условие запроса |
3 |
Создайте триггер, который удаляет всю строчку из базы, если удалить любую его часть. |
CREATE OR REPLACE FUNCTION add_to_debtors()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
DECLARE
surnameD TEXT;
nameD TEXT;
patronymicD TEXT;
students_group_numberD TEXT;
BEGIN
SELECT surname
INTO surnameD
FROM student
WHERE new.student_id = student_id;
SELECT name
INTO nameD
FROM student
WHERE new.student_id = student_id;
SELECT patronymic
INTO patronymicD
FROM student
WHERE new.student_id = student_id;
SELECT students_group_number
INTO students_group_numberD
FROM student
WHERE new.student_id = student_id;
IF NEW.mark = 2 THEN
INSERT INTO debtor_students (surname, name, patronymic, group_id, debt_subject_id)
VALUES (surnameD, nameD, patronymicD, students_group_numberD, NEW.field);
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER add_to_debtors_trigger
AFTER INSERT OR UPDATE ON Field_comprehension
FOR EACH ROW
EXECUTE FUNCTION add_to_debtors();
UPDATE field_comprehension
SET mark = 2
WHERE student_id=838389 and field = '83871d28-6e1b-4f5c-b1f9-5a7a4a63d84b'