added 2 and 1b point

This commit is contained in:
ada-dmitry
2023-12-04 11:12:10 +03:00
parent d6d403f3d5
commit 6dc308a601
2 changed files with 169 additions and 18 deletions
+129 -14
View File
@@ -9,24 +9,82 @@ b) Напишите программу на языке PL/SQL, печатающ
и имя сотрудника с идентификатором 1 и всех его подчинённых, как
прямых, так и подчинённых более низкого ранга. */
CREATE OR REPLACE PROCEDURE department_names() AS $$
DECLARE d_attrs RECORD;
BEGIN
-- 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 )
-- 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();
-- Пункт а)
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;
-- Пункт б)
CREATE OR REPLACE PROCEDURE department_names(integer) AS $$
DECLARE
d_attrs RECORD;
i integer;
l integer;
BEGIN
FOR d_attrs IN
(
SELECT id,last_name, first_name, manager_id
FROM bd6_employees
ORDER BY manager_id
)
LOOP
IF d_attrs.manager_id=$1 THEN
RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
l:= d_attrs.id;
CALL department_names(l);
END IF;
END LOOP;
END $$ LANGUAGE plpgsql;
CALL department_names();
CREATE OR REPLACE PROCEDURE department_names2(integer) AS $$
DECLARE
d_attrs RECORD;
BEGIN
FOR d_attrs IN
(
SELECT
id,
last_name,
first_name,
manager_id
FROM bd6_employees
ORDER BY manager_id
)
LOOP
IF d_attrs.id=$1 THEN
RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
END IF;
END LOOP;
CALL department_names($1);
END $$ LANGUAGE plpgsql;
CALL department_names2(4);
-- Task 2 --
@@ -60,6 +118,32 @@ LOOP
m_salary := ((current_salary + mod_salary) / 100) * 100;
END IF;
RAISE NOTICE 'Employee: % % || Modified Salary: %', employee_rec.last_name, employee_rec.first_name, m_salary;
END LOOP;
END $$ LANGUAGE plpgsql;
CALL print_employees();
CREATE OR REPLACE PROCEDURE print_employees() AS $$
DECLARE
current_salary INTEGER;
m_salary INTEGER;
mod_salary INTEGER := 0;
employee_rec RECORD;
BEGIN
FOR employee_rec IN (
SELECT last_name, first_name, salary_in_euro
FROM bd6_employees
ORDER BY salary_in_euro)
LOOP
current_salary := employee_rec.salary_in_euro;
IF mod_salary=0 THEN
m_salary := (current_salary / 100) * 100;
ELSE
m_salary := ((current_salary + mod_salary) / 100) * 100;
END IF;
RAISE NOTICE 'Employee: % %, Modified Salary: %', employee_rec.last_name, employee_rec.first_name, m_salary;
mod_salary := current_salary - m_salary;
END LOOP;
@@ -141,3 +225,34 @@ end case;
END LOOP;
END $$ LANGUAGE plpgsql;
call f();
-- Task 7 from lab4 --
CREATE OR REPLACE PROCEDURE department_names(integer) AS $$DECLARE d_attrs RECORD;
i integer;l integer;
BEGIN
FOR d_attrs IN ( SELECT id,last_name, first_name, manager_id
FROM bd6_employees order by manager_id )
LOOP
if d_attrs.manager_id=$1 then
RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id; l:= d_attrs.id;
call department_names(l); end if;
END LOOP;
END $$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE department_names2(integer) AS $$
DECLARE d_attrs RECORD;
BEGINFOR d_attrs IN (
SELECT id,last_name, first_name, manager_id FROM bd6_employees order by manager_id )
LOOP
if d_attrs.id=$1 then RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
end if;END LOOP;
CALL department_names($1);END $$ LANGUAGE plpgsql;
CALL department_names2(4);
+36
View File
@@ -34,3 +34,39 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
SELECT rearrange_salaries();
CREATE OR REPLACE FUNCTION update_salaries() RETURNS VOID AS $$
DECLARE
max_salary_employee_id INTEGER;
min_salaries numeric[];
max_salaries numeric[];
i INTEGER;
const CONSTANT INTEGER = 10;
BEGIN
-- Получаем заработные платы последних 10 человек с самой маленькой заработной платой
SELECT array_agg(id) FROM bd6_employees
ORDER BY salary_in_euro ASC
LIMIT const INTO min_salaries;
-- Получаем заработные платы 10 первых человек с самой большой заработной платой
SELECT array_agg(id) FROM bd6_employees
ORDER BY salary_in_euro DESC
LIMIT const INTO max_salaries;
-- Добавляем заработные платы
FOR i IN 1..const LOOP
UPDATE bd6_employees
SET salary_in_euro = salary_in_euro + min_salaries[i]
WHERE id = max_salaries[i];
END LOOP;
-- Удаляем 10 человек с наименьшей заработной платой
DELETE FROM bd6_employees
WHERE id IN (SELECT unnest(min_salaries));
RAISE NOTICE 'Заработные платы обновлены и % человек удалены', const;
END;
$$ LANGUAGE plpgsql;