Files
DB.mephi_ada/Lab/Lab#6/test3.sql
T
2023-12-04 11:12:10 +03:00

72 lines
2.2 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION rearrange_salaries() RETURNS VOID AS $$
DECLARE
salaries RECORD;
small NUMERIC[];
larg NUMERIC[];
const CONSTANT INTEGER = 10;
BEGIN
FOR salaries IN
SELECT id, salary_in_euro
FROM bd6_employees
ORDER BY salary_in_euro
LIMIT const
LOOP
small = array_append(small, (SELECT salary_in_euro FROM bd6_employees WHERE id = salaries.id));
DELETE FROM bd6_employees
WHERE id = salaries.id;
END LOOP;
FOR salaries IN
SELECT id, salary_in_euro
FROM bd6_employees
ORDER BY salary_in_euro DESC
LIMIT const
LOOP
larg = array_append(larg, (SELECT id FROM bd6_employees WHERE id = salaries.id));
END LOOP;
FOR i IN 1..const
LOOP
UPDATE bd6_employees
SET salary_in_euro = salary_in_euro + small[i]
WHERE id = larg[i];
END LOOP;
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;