mirror of
https://github.com/ada-dmitry/DB.mephi_ada.git
synced 2026-09-24 08:00:16 +00:00
added 6lab
This commit is contained in:
@@ -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();
|
||||||
Reference in New Issue
Block a user