mirror of
https://github.com/ada-dmitry/DB.mephi_ada.git
synced 2026-09-24 08:00:16 +00:00
reboot rep
This commit is contained in:
@@ -56,49 +56,47 @@ SELECT * FROM people_log;
|
|||||||
-- операций с отрицательной суммой и данные об общем числе операций
|
-- операций с отрицательной суммой и данные об общем числе операций
|
||||||
-- и среднем значении суммы.
|
-- и среднем значении суммы.
|
||||||
|
|
||||||
CREATE OR REPLACE PROCEDURE statement_of_acount(start_date DATE, end_date DATE) AS $$
|
CREATE OR REPLACE FUNCTION statement_of_account(start_date DATE, end_date DATE) RETURNS VOID AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
pos_sum RECORD;
|
pos_counter INTEGER := 0;
|
||||||
neg_sum RECORD;
|
neg_counter INTEGER := 0;
|
||||||
total_count INTEGER;
|
total_sum NUMERIC := 0;
|
||||||
avg_amount NUMERIC;
|
total_count INTEGER := 0;
|
||||||
const CONSTANT INTEGER = 3;
|
const CONSTANT INTEGER := 3;
|
||||||
|
avg_amount NUMERIC := 0;
|
||||||
|
operation RECORD;
|
||||||
BEGIN
|
BEGIN
|
||||||
FOR pos_sum IN (
|
FOR operation IN (
|
||||||
SELECT operation_date, sum
|
SELECT operation_date, sum
|
||||||
FROM people_log
|
FROM people_log
|
||||||
WHERE operation_date BETWEEN start_date AND end_date AND sum > 0
|
WHERE operation_date BETWEEN start_date AND end_date
|
||||||
ORDER BY sum DESC
|
ORDER BY sum
|
||||||
LIMIT const
|
|
||||||
) LOOP
|
) LOOP
|
||||||
RAISE INFO 'Positive: %, Sum: %', pos_sum.operation_date, pos_sum.sum;
|
IF operation.sum > 0 THEN
|
||||||
|
pos_counter := pos_counter + 1;
|
||||||
|
IF pos_counter <= const THEN
|
||||||
|
RAISE INFO 'Positive: %, Sum: %', operation.operation_date, operation.sum;
|
||||||
|
END IF;
|
||||||
|
ELSE
|
||||||
|
neg_counter := neg_counter + 1;
|
||||||
|
IF neg_counter <= const THEN
|
||||||
|
RAISE INFO 'Negative: %, Sum: %', operation.operation_date, operation.sum;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
total_sum := total_sum + operation.sum;
|
||||||
|
total_count := total_count + 1;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
FOR neg_sum IN (
|
IF total_count > 0 THEN
|
||||||
SELECT operation_date, sum
|
avg_amount := total_sum / total_count;
|
||||||
FROM people_log
|
END IF;
|
||||||
WHERE operation_date BETWEEN start_date AND end_date AND sum < 0
|
|
||||||
ORDER BY sum ASC
|
|
||||||
LIMIT const
|
|
||||||
) LOOP
|
|
||||||
RAISE INFO 'Negative: %, Sum: %', neg_sum.operation_date, neg_sum.sum;
|
|
||||||
END LOOP;
|
|
||||||
|
|
||||||
SELECT COUNT(*) INTO total_count
|
|
||||||
FROM people_log
|
|
||||||
WHERE operation_date BETWEEN start_date AND end_date;
|
|
||||||
|
|
||||||
SELECT AVG(sum) INTO avg_amount
|
|
||||||
FROM people_log
|
|
||||||
WHERE operation_date BETWEEN start_date AND end_date;
|
|
||||||
|
|
||||||
RAISE INFO 'Total number of operations: %', total_count;
|
RAISE INFO 'Total number of operations: %', total_count;
|
||||||
RAISE INFO 'Average amount of transactions: %', avg_amount;
|
RAISE INFO 'Average amount of transactions: %', avg_amount;
|
||||||
|
END
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
END $$ LANGUAGE plpgsql;
|
|
||||||
|
|
||||||
CALL statement_of_acount('2023-01-01', '2023-12-31');
|
|
||||||
|
|
||||||
|
|
||||||
-- Задание 3
|
-- Задание 3
|
||||||
@@ -115,14 +113,62 @@ CALL statement_of_acount('2023-01-01', '2023-12-31');
|
|||||||
|
|
||||||
CREATE OR REPLACE PROCEDURE account_operation(new_id integer, add_sum numeric) AS $$
|
CREATE OR REPLACE PROCEDURE account_operation(new_id integer, add_sum numeric) AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
|
m integer;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
select into m count(operation_date) from people_log where to_char(operation_date,'DD')= to_char(now(),'DD');
|
||||||
|
if m>=3 then
|
||||||
|
|
||||||
UPDATE people
|
UPDATE people
|
||||||
SET amount = amount + add_sum
|
SET amount = amount + add_sum
|
||||||
WHERE id = new_id;
|
WHERE id = new_id;
|
||||||
INSERT INTO people_log (person_id, operation_date, sum) VALUES (new_id, CURRENT_TIMESTAMP(0), add_sum);
|
INSERT INTO people_log (person_id, operation_date, sum) VALUES (new_id, CURRENT_TIMESTAMP(0), add_sum);
|
||||||
|
ELSE
|
||||||
|
raise info 'Too many operations'
|
||||||
END $$ LANGUAGE plpgsql;
|
END $$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
CALL account_operation(5, 1000000);
|
CALL account_operation(5, 1000000);
|
||||||
|
|
||||||
SELECT * FROM people;
|
SELECT * FROM people;
|
||||||
SELECT * FROM people_log;
|
SELECT * FROM people_log;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION statement_of_account(start_date DATE, end_date DATE) RETURNS VOID AS $$
|
||||||
|
DECLARE
|
||||||
|
pos_counter INTEGER := 0;
|
||||||
|
neg_counter INTEGER := 0;
|
||||||
|
total_sum NUMERIC := 0;
|
||||||
|
total_count INTEGER := 0;
|
||||||
|
const CONSTANT INTEGER := 3;
|
||||||
|
avg_amount NUMERIC := 0;
|
||||||
|
operation RECORD;
|
||||||
|
BEGIN
|
||||||
|
FOR operation IN (
|
||||||
|
SELECT operation_date, sum
|
||||||
|
FROM people_log
|
||||||
|
WHERE operation_date BETWEEN start_date AND end_date
|
||||||
|
ORDER BY sum
|
||||||
|
) LOOP
|
||||||
|
IF operation.sum > 0 THEN
|
||||||
|
pos_counter := pos_counter + 1;
|
||||||
|
IF pos_counter <= const THEN
|
||||||
|
RAISE INFO 'Positive: %, Sum: %', operation.operation_date, operation.sum;
|
||||||
|
END IF;
|
||||||
|
ELSE
|
||||||
|
neg_counter := neg_counter + 1;
|
||||||
|
IF neg_counter <= const THEN
|
||||||
|
RAISE INFO 'Negative: %, Sum: %', operation.operation_date, operation.sum;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
total_sum := total_sum + operation.sum;
|
||||||
|
total_count := total_count + 1;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
IF total_count > 0 THEN
|
||||||
|
avg_amount := total_sum / total_count;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
RAISE INFO 'Total number of operations: %', total_count;
|
||||||
|
RAISE INFO 'Average amount of transactions: %', avg_amount;
|
||||||
|
END
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
DROP TABLE IF EXISTS bd6_departments;
|
||||||
|
DROP TABLE IF EXISTS bd6_employees;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE bd6_departments(
|
||||||
|
id integer PRIMARY KEY,
|
||||||
|
name varchar(64),
|
||||||
|
postal_code varchar(6),
|
||||||
|
street varchar(64),
|
||||||
|
building varchar(16),
|
||||||
|
city varchar(32)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO bd6_departments
|
||||||
|
VALUES(10, 'Administration', '109658', 'Leningradskoe shosse', '1', 'Moscow'),
|
||||||
|
(20, 'Marketing', '107701', 'Lenina', '22a', 'Volgograd'),
|
||||||
|
(30, 'Purchasing', '109901', 'Mikluho-Maklaya', '8', 'Bryansk'),
|
||||||
|
(40, 'Human Resources', '10967', '5-ya parkovaya', '16', 'Moscow'),
|
||||||
|
(50, 'Shipping', '109659', '38 Bakinskih komissarov', '77', 'Moscow'),
|
||||||
|
(60, 'IT', '109902', 'Pervomajskaya', '33', 'Kirov');
|
||||||
|
|
||||||
|
CREATE TABLE bd6_employees(
|
||||||
|
id integer PRIMARY KEY,
|
||||||
|
last_name varchar(64) NOT NULL,
|
||||||
|
first_name varchar(64) NOT NULL,
|
||||||
|
phone_number varchar(18),
|
||||||
|
email varchar(32),
|
||||||
|
department_id integer NOT NULL,
|
||||||
|
manager_id integer,
|
||||||
|
salary_in_euro numeric(8, 2) DEFAULT 0 NOT NULL,
|
||||||
|
UNIQUE(last_name, first_name, department_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO bd6_employees VALUES(1, 'Radygin', 'Victor', '8-(495)-567-7788', 'vr@e.mail.mephi.ru', 10, NULL, 8000),
|
||||||
|
(2, 'Kuprijanov', 'Dmitrij', '8-(495)-567-7794', 'kd@e.mail.mephi.ru', 60, 1, 6534.33),
|
||||||
|
(3, 'Ivanov-Skladovskij', 'Ivan', '8-(495)-567-7799', 'ii1@mail.mephi.ru', 20, 1, 4404.14),
|
||||||
|
(4, 'Petrov', 'Petr', '8-(495)-567-7794', 'petrovpetr@m.gmail.ru', 60, 2, 3456.43),
|
||||||
|
(5, 'kozlov', 'Konstantin', '8-(495)-567-7794', 'kkozlov@mephi.ru', 60, 2, 2300),
|
||||||
|
(6, 'Abramov', 'Abram', '8-(495)-567-7794', 'abramova@k75.mephi.ru', 60, 2, 2200.11),
|
||||||
|
(7, 'IvanovпїЅ-SkladovskпїЅya-Petrova', 'Ivanka', '8-(495)-567-7794', 'ii2@mail.mephi.ru', 60, 4, 3756.33),
|
||||||
|
(8, 'Petrov', 'Ivan', '8-(495)-567-7799', 'petrovivan@m.gmail.ru', 20, 3, 4850),
|
||||||
|
(9, 'kozlov', 'Ivan', '8-(495)-567-7799', 'ikozlov@mephi.ru', 20, 3, 3460),
|
||||||
|
(10, 'Abramov', 'Moisej', '8-(495)-567-7794', 'abramovm@k75.mephi.ru', 60, 4, 2345),
|
||||||
|
(11, 'Petrov', 'Alex', '8-(495)-567-7799', 'petroval@m.gmail.ru', 20, 3, 2465),
|
||||||
|
(12, 'kozlov', 'Maxim', '8-(495)-567-7799', 'mkozlov@mephi.ru', 20, 3, 2788),
|
||||||
|
(13, 'Abramov', 'Isyaslav', '8-(495)-567-7738', 'abramovi@k75.mephi.ru', 30, 1, 6500);
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
DROP TABLE IF EXISTS bd6_employees;
|
DROP TABLE IF EXISTS bd6_employees;
|
||||||
|
|
||||||
-- CREATE TABLE bd6_departments(
|
CREATE TABLE bd6_departments(
|
||||||
-- id integer PRIMARY KEY,
|
id integer PRIMARY KEY,
|
||||||
-- name varchar(64),
|
name varchar(64),
|
||||||
-- postal_code varchar(6),
|
postal_code varchar(6),
|
||||||
-- street varchar(64),
|
street varchar(64),
|
||||||
-- building varchar(16),
|
building varchar(16),
|
||||||
-- city varchar(32)
|
city varchar(32)
|
||||||
-- );
|
);
|
||||||
CREATE TABLE
|
CREATE TABLE
|
||||||
bd6_employees (
|
bd6_employees (
|
||||||
id integer PRIMARY KEY,
|
id integer PRIMARY KEY,
|
||||||
@@ -21,13 +21,13 @@ CREATE TABLE
|
|||||||
UNIQUE (last_name, first_name, department_id)
|
UNIQUE (last_name, first_name, department_id)
|
||||||
);
|
);
|
||||||
|
|
||||||
-- INSERT INTO bd6_departments
|
INSERT INTO bd6_departments
|
||||||
-- VALUES(10, 'Administration', '109658', 'Leningradskoe shosse', '1', 'Moscow'),
|
VALUES(10, 'Administration', '109658', 'Leningradskoe shosse', '1', 'Moscow'),
|
||||||
-- (20, 'Marketing', '107701', 'Lenina', '22a', 'Volgograd'),
|
(20, 'Marketing', '107701', 'Lenina', '22a', 'Volgograd'),
|
||||||
-- (30, 'Purchasing', '109901', 'Mikluho-Maklaya', '8', 'Bryansk'),
|
(30, 'Purchasing', '109901', 'Mikluho-Maklaya', '8', 'Bryansk'),
|
||||||
-- (40, 'Human Resources', '10967', '5-ya parkovaya', '16', 'Moscow'),
|
(40, 'Human Resources', '10967', '5-ya parkovaya', '16', 'Moscow'),
|
||||||
-- (50, 'Shipping', '109659', '38 Bakinskih komissarov', '77', 'Moscow'),
|
(50, 'Shipping', '109659', '38 Bakinskih komissarov', '77', 'Moscow'),
|
||||||
-- (60, 'IT', '109902', 'Pervomajskaya', '33', 'Kirov');
|
(60, 'IT', '109902', 'Pervomajskaya', '33', 'Kirov');
|
||||||
INSERT INTO
|
INSERT INTO
|
||||||
bd6_employees
|
bd6_employees
|
||||||
VALUES
|
VALUES
|
||||||
@@ -189,6 +189,33 @@ call f();
|
|||||||
|
|
||||||
-- Task 7 from lab4 --
|
-- Task 7 from lab4 --
|
||||||
|
|
||||||
|
|
||||||
|
CREATE table staff(
|
||||||
|
id integer primary key,
|
||||||
|
name varchar(64) NOT NULL,
|
||||||
|
department varchar(64) NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE SEQUENCE staff_id_seq
|
||||||
|
START WITH 12
|
||||||
|
CYCLE
|
||||||
|
INCREMENT BY 8
|
||||||
|
CACHE 100;
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO staff VALUES
|
||||||
|
(nextval('staff_id_seq'), 'Ivan Makarenko', 'Director');
|
||||||
|
|
||||||
|
INSERT INTO staff
|
||||||
|
(SELECT nextval('staff_id_seq'), last_name, department_name
|
||||||
|
FROM employees e JOIN departments d ON e.department_id = d.department_id);
|
||||||
|
|
||||||
|
UPDATE staff SET department = 'Innovations department'
|
||||||
|
WHERE id < 40;
|
||||||
|
|
||||||
|
DELETE FROM staff
|
||||||
|
WHERE name ILIKE('%K%');
|
||||||
|
|
||||||
CREATE VIEW dep_staff_counts AS
|
CREATE VIEW dep_staff_counts AS
|
||||||
SELECT department, COUNT(*) AS ecount
|
SELECT department, COUNT(*) AS ecount
|
||||||
FROM staff
|
FROM staff
|
||||||
@@ -200,42 +227,224 @@ SELECT * FROM dep_staff_counts;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE PROCEDURE department_names(integer) AS $$
|
-- 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;
|
||||||
|
-- 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);
|
||||||
|
|
||||||
|
|
||||||
|
/* Вариант 1 || Работа 6 || Антипенко, Дробышевский */
|
||||||
|
|
||||||
|
|
||||||
|
-- Task 1 --
|
||||||
|
-- Пункт а)
|
||||||
|
WITH RECURSIVE tmp AS (
|
||||||
|
|
||||||
|
SELECT id, first_name, last_name, manager_id, 1 AS level
|
||||||
|
FROM bd6_employees
|
||||||
|
WHERE 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
|
||||||
|
;
|
||||||
|
|
||||||
|
-- Пункт б)
|
||||||
|
CREATE OR REPLACE PROCEDURE depa(integer) AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
d_attrs RECORD;
|
d_attrs RECORD;
|
||||||
i INTEGER;
|
i integer;
|
||||||
l 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;
|
|
||||||
BEGIN
|
BEGIN
|
||||||
FOR d_attrs IN
|
FOR d_attrs IN
|
||||||
(
|
(
|
||||||
SELECT id,last_name, first_name, manager_id
|
SELECT id,last_name, first_name, manager_id
|
||||||
FROM bd6_employees
|
FROM bd6_employees
|
||||||
order by manager_id
|
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 depa(l);
|
||||||
|
END IF;
|
||||||
|
END LOOP;
|
||||||
|
END $$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
CREATE OR REPLACE PROCEDURE dep(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
|
LOOP
|
||||||
if d_attrs.id=$1 then
|
IF d_attrs.id=$1 THEN
|
||||||
RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
|
RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
|
||||||
end if;
|
END IF;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
CALL department_names($1);
|
CALL depa($1);
|
||||||
END $$ LANGUAGE plpgsql;
|
END $$ LANGUAGE plpgsql;
|
||||||
CALL department_names2(4);
|
CALL dep(1);
|
||||||
|
|
||||||
|
-- Task 2 --
|
||||||
|
|
||||||
|
UPDATE bd6_employees SET salary_in_euro = 299 WHERE id = 3;
|
||||||
|
|
||||||
|
CREATE OR REPLACE PROCEDURE print_employees() AS $$
|
||||||
|
DECLARE
|
||||||
|
current_salary INTEGER;
|
||||||
|
m_salary INTEGER;
|
||||||
|
mod_salary INTEGER := 0;
|
||||||
|
employee_rec RECORD;
|
||||||
|
i INTEGER = 0;
|
||||||
|
cnt INTEGER;
|
||||||
|
BEGIN
|
||||||
|
SELECT COUNT(*) INTO cnt FROM bd6_employees;
|
||||||
|
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 cnt - 1 = i THEN
|
||||||
|
m_salary := ((current_salary) / 100) * 100 + mod_salary;
|
||||||
|
ELSE
|
||||||
|
m_salary := ((current_salary) / 100) * 100;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
RAISE NOTICE 'Employee: % % || Modified Salary: %', employee_rec.last_name, employee_rec.first_name, m_salary;
|
||||||
|
|
||||||
|
mod_salary := mod_salary + mod(current_salary, 100);
|
||||||
|
i := i+1;
|
||||||
|
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
END $$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
CALL print_employees();
|
||||||
|
SELECT *
|
||||||
|
FROM bd6_employees
|
||||||
|
ORDER BY salary_in_euro;
|
||||||
|
|
||||||
|
|
||||||
|
-- Task 3 --
|
||||||
|
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));
|
||||||
|
UPDATE bd6_employees SET manager_id = NULL WHERE manager_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();
|
||||||
|
|
||||||
|
-- Task 4 --
|
||||||
|
|
||||||
|
CREATE OR REPLACE PROCEDURE f() AS $$
|
||||||
|
DECLARE d_attrs RECORD;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
FOR d_attrs IN WITH RECURSIVE tmp AS (
|
||||||
|
SELECT 1+i*5 AS f1, 2+i*5 AS f2, 3+i*5 AS f3, 4+i*5 AS f4,5+i*5 AS f5
|
||||||
|
FROM generate_series(0,199) i)
|
||||||
|
|
||||||
|
SELECT * FROM tmp
|
||||||
|
LOOP
|
||||||
|
case
|
||||||
|
when ( mod(d_attrs.f1,2)!=0)
|
||||||
|
then RAISE INFO ' % % % % %', d_attrs.f1, d_attrs.f2, d_attrs.f3, d_attrs.f4, d_attrs.f5;
|
||||||
|
when ( mod(d_attrs.f1,2)=0)
|
||||||
|
then RAISE INFO ' % % % % %', d_attrs.f5, d_attrs.f4, d_attrs.f3, d_attrs.f2, d_attrs.f1;
|
||||||
|
end case;
|
||||||
|
END LOOP;
|
||||||
|
END $$ LANGUAGE plpgsql;
|
||||||
|
call f();
|
||||||
|
|
||||||
|
-- Task 7 from lab4 --
|
||||||
|
DROP VIEW IF EXISTS dep_staff_counts;
|
||||||
|
|
||||||
|
CREATE VIEW dep_staff_counts AS
|
||||||
|
SELECT department, COUNT(*) AS ecount
|
||||||
|
FROM staff
|
||||||
|
GROUP BY department;
|
||||||
|
|
||||||
|
SELECT * FROM dep_staff_counts;
|
||||||
+72
@@ -0,0 +1,72 @@
|
|||||||
|
--2
|
||||||
|
SELECT *
|
||||||
|
FROM bd_departments
|
||||||
|
WHERE LENGTH(street) = POWER(SQRT(75 + LENGTH(street)), 2) / 4;
|
||||||
|
|
||||||
|
INSERT INTO bd_departments VALUES
|
||||||
|
(35,'meow', 407596, 'aaaaaaaaaaaaaaaaaaaaaaaaa', 2, 'MSK');
|
||||||
|
--4
|
||||||
|
CREATE TABLE employees_backup AS
|
||||||
|
SELECT *,
|
||||||
|
CASE
|
||||||
|
WHEN random() < 0.5 THEN 'Active'
|
||||||
|
ELSE 'Inactive'
|
||||||
|
END AS employee_status
|
||||||
|
FROM bd_employees;
|
||||||
|
SELECT * FROM employees_backup;
|
||||||
|
--5
|
||||||
|
SELECT e.employee_id, e.first_name, e.last_name, e.manager_id
|
||||||
|
FROM employees e
|
||||||
|
JOIN employees m ON e.manager_id = m.employee_id
|
||||||
|
WHERE LENGTH(m.last_name) > 6;
|
||||||
|
|
||||||
|
--3--
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
DECLARE
|
||||||
|
BEGIN
|
||||||
|
RAISE NOTICE 'Шахматная доска:';
|
||||||
|
CALL chess('z9', 'C');
|
||||||
|
|
||||||
|
|
||||||
|
RAISE NOTICE 'Размещение фигуры А на клетке A5:';
|
||||||
|
CALL chess('a5', ' A ');
|
||||||
|
|
||||||
|
|
||||||
|
RAISE NOTICE 'Размещение фигуры У на клетке H4:';
|
||||||
|
CALL chess('h4', ' Y ');
|
||||||
|
|
||||||
|
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CREATE OR REPLACE PROCEDURE chess(pos varchar, bukva char) AS $$
|
||||||
|
DECLARE
|
||||||
|
board text;
|
||||||
|
queen_col integer;
|
||||||
|
queen_row integer;
|
||||||
|
BEGIN
|
||||||
|
queen_col := ascii(substring(pos from 1 for 1)) - 96;
|
||||||
|
queen_row := substring(pos from 2)::integer;
|
||||||
|
|
||||||
|
FOR i IN 1..8 LOOP
|
||||||
|
board := '';
|
||||||
|
|
||||||
|
FOR j IN 1..8 LOOP
|
||||||
|
IF i = queen_row AND j = queen_col THEN
|
||||||
|
board := board || bukva;
|
||||||
|
ELSE
|
||||||
|
IF (i + j) % 2 = 0 THEN
|
||||||
|
board := board || ' б ';
|
||||||
|
ELSE
|
||||||
|
board := board || ' ч ';
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
RAISE NOTICE '%', board;
|
||||||
|
END LOOP;
|
||||||
|
END
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
SELECT chess('c3');
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
DO $$
|
||||||
|
DECLARE
|
||||||
|
board CHAR(8)[][] := ARRAY[
|
||||||
|
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||||
|
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
|
||||||
|
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||||
|
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
|
||||||
|
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||||
|
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
|
||||||
|
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||||
|
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б']
|
||||||
|
];
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
RAISE NOTICE 'Шахматная доска:';
|
||||||
|
FOR i IN REVERSE 1..8 LOOP
|
||||||
|
RAISE NOTICE '%', board[i];
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
RAISE NOTICE 'Размещение фигуры А на клетке A5:';
|
||||||
|
board[8 - 5 + 1][ASCII('A') - 64] := 'A';
|
||||||
|
FOR i IN REVERSE 1..8 LOOP
|
||||||
|
RAISE NOTICE '%', board[i];
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
RAISE NOTICE 'Размещение фигуры У на клетке H4:';
|
||||||
|
board[8 - ч + 1][ASCII('H') - 64] := 'У';
|
||||||
|
FOR i IN REVERSE 1..8 LOOP
|
||||||
|
RAISE NOTICE '%', board[i];
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
END $$;
|
||||||
Reference in New Issue
Block a user