diff --git a/Lab/Lab#6/lab6.sql b/Lab/Lab#6/lab6.sql new file mode 100644 index 0000000..e4900c8 --- /dev/null +++ b/Lab/Lab#6/lab6.sql @@ -0,0 +1,74 @@ +/* Вариант 1 || Работа 6 || Антипенко, Дробышевский */ + + +-- Task 1 -- +/* a) Напишите запрос, используя конструкцию WITH, выбирающий +рекурсивно сотрудника с идентификатором 1 и все его подчинённых, +как прямых, так и подчинённых более низкого ранга*. +b) Напишите программу на языке PL/SQL, печатающую на экран фамилию +и имя сотрудника с идентификатором 1 и всех его подчинённых, как +прямых, так и подчинённых более низкого ранга. */ + +CREATE OR REPLACE PROCEDURE department_names() AS $$ +DECLARE d_attrs RECORD; +BEGIN + +FOR d_attrs IN WITH RECURSIVE tmp AS ( + SELECT id, first_name, last_name, manager_id, 1 AS level + FROM bd6_employees + WHERE manager_id = 1 or id = 1 + UNION ALL + SELECT e.id, e.first_name, e.last_name, e.manager_id, t.level + 1 + FROM bd6_employees e JOIN tmp t ON e.manager_id = t.id ) + +SELECT * FROM tmp +LOOP + RAISE INFO ' % % ', d_attrs.first_name, d_attrs.last_name; +END LOOP; +END $$ LANGUAGE plpgsql; +CALL department_names(); + + +-- Task 2 -- +/* Напишите программу на языке PL/SQL, выбирающую строки из таблицы +employees в порядке возрастания заработной платы (salary) и печатающие на +экран следующие данные: фамилия, имя, модифицированная заработная +плата. Модифицированная заработная плата получается следующим +образом: у первого по порядку сотрудника она округляется до сотен в +меньшую сторону, а у всех последующих сотрудников она сначала +увеличивается на остаток от округления, полученный от предыдущего +сотрудника, а затем округляется до сотен в меньшую сторону. */ + +-- Task 3 -- +/* Напишите программу на языке PL/SQL, удаляющую 10 сотрудников с +самой маленькой заработной платой. При этом их заработная плата должна +добавиться 10 сотрудникам с самой большой заработной платой. Причём +самая маленькая заработная плата должна добавиться к человеку с самой +большой заработной платой. 2-я с конца заработная плата должна добавиться +к человеку со второй по размеру заработной платой и т.д. */ + +-- Task 4 -- +/* Создайте таблицу spiral с 5 полями f1, f2, f3, f4, f5 – целые числа. +Напишите программу на языке PL/SQL, заполняющую данную таблицу 1000 +строк по следующему принципу: +1 2 3 4 5 +10 9 8 7 6 +11 12 13 14 15 +20 19 18 17 16 +21 22 23 24 25 */ + +CREATE OR REPLACE PROCEDURE f() AS $$ +DECLARE d_attrs RECORD; +BEGIN + +FOR d_attrs IN WITH RECURSIVE tmp AS ( + SELECT i AS f1, i2 AS f2, i3 AS f3,i4 AS f4,i5 AS f5 + FROM generate_series(1,200) i) + +SELECT * FROM tmp +LOOP +RAISE INFO ' % % % % %', +d_attrs.f1, d_attrs.f2, d_attrs.f3, d_attrs.f4, d_attrs.f5; +END LOOP; +END $$ LANGUAGE plpgsql; +call f();