This commit is contained in:
ada-dmitry
2024-03-30 17:38:26 +03:00
31 changed files with 2178 additions and 106 deletions
+174
View File
@@ -0,0 +1,174 @@
-- Лабораторная работа №7 || Антипенко, Дробышевский || Вариант 4 --
-- Задание 1
-- • Создайте две таблицы: people и people_log. Первая таблица должна
-- содержать поля идентификатор (id), имя (first_name), фамилия
-- (last_name), дата рождения (birthday), текущее состояние счёта
-- (amount). Поле id – это первичный ключ. Поле amount – это
-- действительное число. Вторая таблица должна содержать поля:
-- идентификатор человека (person_id) дата операции (operation_date),
-- сумма (sum). Поле person_id должно быть ограничено, как внешний
-- ключ, ссылающийся на поле id таблицы people. Поле operation_date
-- должно позволить сохранять дату и время. Поле sum – это
-- действительное число. Заполните таблицы people и people_log
-- несколькими записями (не менее 5 на таблицу).
CREATE TABLE people (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
birthday DATE,
amount DECIMAL(10, 2)
);
CREATE TABLE people_log (
id SERIAL PRIMARY KEY,
person_id INTEGER REFERENCES people(id),
operation_date TIMESTAMP,
sum DECIMAL(10, 2)
);
INSERT INTO people (first_name, last_name, birthday, amount)
VALUES
('Иван', 'Иванов', '1985-05-15', 1000.50),
('Петр', 'Петров', '1990-10-20', 750.25),
('Мария', 'Сидорова', '1978-12-03', 3000.75),
('Елена', 'Козлова', '1989-08-27', 200.00),
('Алексей', 'Смирнов', '1980-04-18', 1500.00);
INSERT INTO people_log (person_id, operation_date, sum)
VALUES
(1, '2023-09-20 10:15:00', 250.00),
(3, '2023-10-01 15:30:00', 800.50),
(2, '2023-11-05 08:45:00', 100.25),
(4, '2023-11-25 12:00:00', 50.00),
(5, '2023-12-02 18:20:00', 300.00);
SELECT * FROM people;
SELECT * FROM people_log;
-- Задание 2
-- • Напишите процедуру или функцию statement_of_acount, которая на
-- основе двух параметров: даты начала периода и даты окончания
-- периода печатала бы на экран данные (operation_date и sum) трёх самых
-- крупных операций с положительной суммой, трёх самых крупных
-- операций с отрицательной суммой и данные об общем числе операций
-- и среднем значении суммы.
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;
-- Задание 3
-- • Напишите процедуру или функцию account_operation, которая на
-- основе двух параметров: идентификатора человека и суммы вносит
-- изменения в таблицы people и people_log. В таблице people у человека с
-- указанным в качестве параметра идентификатором состояние счёта
-- должно измениться на указанную в качестве параметра сумму. В
-- таблицу people_log должна быть добавлена запись с указанным в
-- качестве параметра идентификатором человека, текущей датой и
-- временем и указанной в качестве параметра суммой.
CREATE OR REPLACE PROCEDURE account_operation(new_id integer, add_sum numeric) AS $$
DECLARE
m integer;
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
SET amount = amount + add_sum
WHERE id = new_id;
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;
CALL account_operation(5, 1000000);
SELECT * FROM people;
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;
+99
View File
@@ -0,0 +1,99 @@
DROP TABLE people_log IF EXISTS;
DROP TABLE people IF EXISTS;
--1--
CREATE TABLE people (
id SERIAL PRIMARY KEY,
first_name VARCHAR(64),
last_name VARCHAR(64),
birthday DATE,
amount NUMERIC(10,2)
);
CREATE TABLE people_log (
person_id INTEGER REFERENCES people(id),
operation_date TIMESTAMP,
sum NUMERIC(10,2)
);
INSERT INTO people (first_name, last_name, birthday, amount)
VALUES ('Andrey', 'Ad', '2004-03-09', 1000.00),
('Sanal', 'Bat', '2004-12-15', 2000.00),
('Alex', 'Yak', '2004-08-10', 3000.00),
('Dima', 'Klev', '2004-04-25', 4000.00),
('David', 'Dav', '2001-11-30', 5000.00),
('Reno', 'G', '2004-08-28', 6000.00),
('Ilya', 'Zim', '2005-01-06', 7000.00),
('Sema', 'Akh', '2005-12-01', 8000.00);
INSERT INTO people_log ( person_id, operation_date, sum)
VALUES
(1, '2022-01-05 17:15:00', 100.00),
(2, '2022-01-06 17:30:00', 300.00),
(3, '2022-01-07 17:45:00', 300.00),
(4, '2022-01-08 18:00:00', 400.00),
(5, '2022-01-09 18:15:00', 500.00),
(6, '2022-01-10 17:15:00', -100.00),
(7, '2022-01-12 17:15:00', -400.00),
(8, '2022-01-29 17:15:00', -200.00);
SELECT * FROM people;
SELECT * FROM people_log;
--2--
CREATE OR REPLACE PROCEDURE statement_of_acount(start_date DATE, end_date DATE) AS $$
DECLARE
pos_sum RECORD;
neg_sum RECORD;
total_count INTEGER;
avg_amount NUMERIC;
BEGIN
FOR pos_sum IN (
SELECT operation_date, sum
FROM people_log
WHERE operation_date BETWEEN start_date AND end_date AND sum > 0
ORDER BY sum DESC
LIMIT 3
) LOOP
RAISE INFO 'Положительная операция: %, Сумма: %', pos_sum.operation_date, pos_sum.sum;
END LOOP;
FOR neg_sum IN (
SELECT operation_date, sum
FROM people_log
WHERE operation_date BETWEEN start_date AND end_date AND sum < 0
ORDER BY sum ASC
LIMIT 3
) LOOP
RAISE INFO 'Отрицательная операция: %, Сумма: %', 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_count;
RAISE INFO 'Средняя сумма операций: %', avg_amount;
END $$ LANGUAGE plpgsql;
CALL statement_of_acount('2022-01-01', '2022-11-12');
--3--
CREATE OR REPLACE PROCEDURE account_operation(new_id integer, summa numeric) AS $$
DECLARE
BEGIN
UPDATE people SET amount = amount + summa WHERE id = new_id;
INSERT INTO people_log (person_id, operation_date, sum) VALUES (new_id, CURRENT_TIMESTAMP(0), summa);
END $$ LANGUAGE plpgsql;
CALL account_operation(1, 100);
@@ -1,6 +1,6 @@
SELECT *
FROM bd_employees
WHERE last_name ~ '^[a-zA-Z]+-[a-zA-Z]+$';
WHERE last_name ~ '^[a-zA-Z]+[-[a-zA-Z]]{0,}';
SELECT *
FROM bd_employees
@@ -18,11 +18,17 @@ SELECT last_name,
FROM bd_employees;
UPDATE staff
SET department = '60'
WHERE id = (
SELECT manager_id
FROM employees
WHERE first_name LIKE 'Neena' AND last_name LIKE 'Kochhar');
SET department = (SELECT department_name FROM departments WHERE department_id = 60)
WHERE department in (
SELECT department_name
FROM departments
WHERE department_id in (
SELECT department_id
FROM employees
WHERE manager_id = (
SELECT employee_id
FROM employees
WHERE first_name = 'Neena' AND last_name= 'Kochhar')));
SELECT *
FROM bd_employees
@@ -30,7 +36,7 @@ WHERE LENGTH(REGEXP_REPLACE(first_name, '[^aeiouAEIOU]', '', 'g')) <= 3;
WITH tmp AS (
SELECT chr(i+96), i FROM generate_series(1,26) i)
SELECT e.last_name, sum(t.i) AS name_sum
FROM bd_employees e
SELECT e.last_name sum(t.i) AS name_sum
FROM db_employees e
JOIN tmp t ON t.chr = ANY(string_to_array(LOWER(e.last_name), NULL))
GROUP BY e.last_name;
GROUP BY e.last_name;
+47
View File
@@ -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);
+163
View File
@@ -0,0 +1,163 @@
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)
);
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 REFERENCES bd6_departments (id) NOT NULL,
manager_id integer REFERENCES bd6_employees (id),
salary_in_euro numeric(8, 2) DEFAULT 0 NOT NULL,
UNIQUE (last_name, first_name, department_id)
);
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');
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
);
+49
View File
@@ -0,0 +1,49 @@
CREATE OR REPLACE PROCEDURE update_salary() AS $$
DECLARE
emp_record bd6_employees%ROWTYPE;
counter integer := 0;
min_salary bd6_employees.salary_in_euro%TYPE;
max_salary bd6_employees.salary_in_euro%TYPE;
BEGIN
-- SELECT MIN(salary_in_euro), MAX(salary_in_euro) INTO min_salary, max_salary FROM bd6_employees;
FOR emp_record IN
SELECT * FROM (SELECT * FROM bd6_employees ORDER BY salary_in_euro LIMIT 3) AS min_salaries
LOOP
DELETE FROM bd6_employees WHERE id = emp_record.id;
counter := counter + 1;
END LOOP;
FOR emp_record IN
SELECT * FROM (SELECT * FROM bd6_employees ORDER BY salary_in_euro DESC LIMIT 3) AS max_salaries
LOOP
UPDATE bd6_employees SET salary_in_euro = salary_in_euro + min_salary WHERE id = emp_record.id;
counter := counter + 1;
END LOOP;
RAISE NOTICE 'Successfully updated % bd6_employees.', counter;
END $$ LANGUAGE plpgsql;
CALL update_salary();
CREATE OR REPLACE PROCEDURE update_and_delete_salaries() AS $$
BEGIN
-- Увеличение заработной платы
WITH lowest_salaries AS (
SELECT id, salary_in_euro
FROM bd6_employees
ORDER BY salary_in_euro
LIMIT 10
), highest_salary AS (
SELECT max(salary_in_euro) AS max_salary
FROM bd6_employees
)
UPDATE bd6_employees e
SET salary_in_euro = e.salary_in_euro + ls.salary_in_euro - (SELECT max_salary FROM highest_salary)
FROM lowest_salaries ls
WHERE e.id = ls.id;
-- Удаление сотрудников
DELETE FROM bd6_employees WHERE id IN (SELECT id FROM lowest_salaries);
RAISE NOTICE 'Salaries updated and lowest paid bd6_employees deleted.';
END;
$$ LANGUAGE plpgsql;
+450
View File
@@ -0,0 +1,450 @@
/* Вариант 1 || Работа 6 || Антипенко, Дробышевский */
-- Task 1 --
/* a) Напишите запрос, используя конструкцию WITH, выбирающий
рекурсивно сотрудника с идентификатором 1 и все его подчинённых,
как прямых, так и подчинённых более низкого ранга*.
b) Напишите программу на языке PL/SQL, печатающую на экран фамилию
и имя сотрудника с идентификатором 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
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 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
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 depa($1);
END $$ LANGUAGE plpgsql;
CALL dep(1);
-- Task 2 --
/* Напишите программу на языке PL/SQL, выбирающую строки из таблицы
employees в порядке возрастания заработной платы (salary) и печатающие на
экран следующие данные: фамилия, имя, модифицированная заработная
плата. Модифицированная заработная плата получается следующим
образом: у первого по порядку сотрудника она округляется до сотен в
меньшую сторону, а у всех последующих сотрудников она сначала
увеличивается на остаток от округления, полученный от предыдущего
сотрудника, а затем округляется до сотен в меньшую сторону. */
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;
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;
m_salary := ((current_salary + mod_salary) / 100) * 100;
RAISE NOTICE 'Employee: % % || Modified Salary: %', employee_rec.last_name, employee_rec.first_name, m_salary;
mod_salary := mod(current_salary + mod_salary,100);
END LOOP;
END $$ LANGUAGE plpgsql;
CALL print_employees();
SELECT *
FROM bd6_employees
ORDER BY salary_in_euro;
-- Task 3 --
/* Напишите программу на языке PL/SQL, удаляющую 10 сотрудников с
самой маленькой заработной платой. При этом их заработная плата должна
добавиться 10 сотрудникам с самой большой заработной платой. Причём
самая маленькая заработная плата должна добавиться к человеку с самой
большой заработной платой. 2-я с конца заработная плата должна добавиться
к человеку со второй по размеру заработной платой и т.д. */
CREATE OR REPLACE FUNCTION rearrange_salaries() RETURNS VOID AS $$
DECLARE
salaries RECORD;
small NUMERIC[];
larg NUMERIC[];
const CONSTANT INTEGER = 3;
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();
-- 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 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 --
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
SELECT department, COUNT(*) AS ecount
FROM staff
GROUP BY department;
SELECT * FROM dep_staff_counts;
-- 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
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 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
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 depa($1);
END $$ LANGUAGE plpgsql;
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
View File
@@ -0,0 +1,72 @@
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;
+104
View File
@@ -0,0 +1,104 @@
-- Task 1 --
CREATE OR REPLACE PROCEDURE molodec() AS $$
DECLARE
name1 varchar := 'Julia';
name2 varchar := 'Пустотааа';
BEGIN
RAISE INFO ' %, %, вы молодцы! ', name1, name2;
END $$ LANGUAGE plpgsql;
CALL molodec();
-- Task 2 --
CREATE OR REPLACE PROCEDURE fiiiizika() AS $$
DECLARE
velocity_kmh NUMERIC := 60;
time_seconds NUMERIC := 30;
velocity_ms NUMERIC;
distance_m NUMERIC;
train_length_m NUMERIC;
BEGIN
velocity_ms := velocity_kmh * 1000 / 3600;
distance_m := velocity_ms * time_seconds;
train_length_m := distance_m;
RAISE INFO ' % ', TRUNC(train_length_m);
END;
$$ LANGUAGE plpgsql;
CALL fiiiizika();
-- Task 3 --
CREATE OR REPLACE PROCEDURE show_city_streets() AS $$
DECLARE
city_record RECORD;
BEGIN
FOR city_record IN SELECT city, street_address FROM locations
LOOP
RAISE NOTICE 'В городе % есть улица %',
city_record.city, city_record.street_address;
END LOOP;
END;
$$ LANGUAGE plpgsql;
CALL show_city_streets();
-- Task 4 --
CREATE OR REPLACE PROCEDURE factorial(n INTEGER) AS $$
DECLARE
result INTEGER := 1;
i INTEGER := 1;
BEGIN
WHILE i <= n LOOP
result := result * i;
i := i + 1;
END LOOP;
RAISE INFO ' % ', result;
END;
$$ LANGUAGE plpgsql;
CALL factorial(10);
-- Task 5 --
CREATE OR REPLACE FUNCTION get_employees_and_managers_names()
RETURNS TABLE (employee_name TEXT, manager_name TEXT) AS $$
BEGIN
RETURN QUERY
SELECT e.first_name || ' ' || e.last_name AS employee_name,
COALESCE(m.first_name || ' ' || m.last_name, 'No manager') AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;
END;
$$ LANGUAGE plpgsql;
SELECT get_employees_and_managers_names();
-- Task 6 --
CREATE OR REPLACE FUNCTION binary_to_decimal(binary_num VARCHAR)
RETURNS NUMERIC AS $$
DECLARE
decimal_num NUMERIC := 0;
power NUMERIC := 0;
bit NUMERIC;
BEGIN
FOR i IN REVERSE 1..LENGTH(binary_num) LOOP
bit := CAST(SUBSTRING(binary_num FROM i FOR 1) AS NUMERIC);
decimal_num := decimal_num + (bit * (2 ^ power));
power := power + 1;
END LOOP;
RETURN decimal_num;
END;
$$ LANGUAGE plpgsql;
SELECT binary_to_decimal('101');
+307
View File
@@ -0,0 +1,307 @@
SET DateStyle TO German;
DROP TABLE IF EXISTS JOB_HISTORY;
DROP TABLE IF EXISTS DEPARTMENTS CASCADE;
DROP TABLE IF EXISTS EMPLOYEES;
DROP TABLE IF EXISTS JOBS;
DROP TABLE IF EXISTS LOCATIONS;
DROP TABLE IF EXISTS COUNTRIES;
DROP TABLE IF EXISTS REGIONS;
CREATE TABLE REGIONS
(
region_id integer PRIMARY KEY,
region_name varchar(64) NOT NULL UNIQUE
);
INSERT INTO regions
VALUES(1, 'Europe '),
(2, 'Americas '),
(3, 'Asia '),
(4, 'Middle East and Africa ');
-- DELETE FROM COUNTRIES;
CREATE TABLE COUNTRIES
(
country_id varchar(2) PRIMARY KEY,
country_name varchar(64) NOT NULL UNIQUE,
region_id integer REFERENCES REGIONS(region_id) NOT NULL
);
INSERT INTO COUNTRIES VALUES
('AR', 'Argentina', 2),
('AU', 'Australia', 3),
('BE', 'Belgium', 1),
('BR', 'Brazil', 2),
('CA', 'Canada', 2),
('CH', 'Switzerland', 1),
('CN', 'China', 3),
('DE', 'Germany', 1),
('DK', 'Denmark', 1),
('EG', 'Egypt', 4),
('FR', 'France', 1),
('IL', 'Israel', 4),
('IN', 'India', 3),
('IT', 'Italy', 1),
('JP', 'Japan', 3),
('KW', 'Kuwait', 4),
('ML', 'Malaysia', 3),
('MX', 'Mexico', 2),
('NG', 'Nigeria', 4),
('NL', 'Netherlands', 1),
('SG', 'Singapore', 3),
('UK', 'United Kingdom', 1),
('US', 'United States of America', 2),
('ZM', 'Zambia', 4),
('ZW', 'Zimbabwe', 4);
-- DELETE FROM LOCATIONS;
CREATE TABLE LOCATIONS
(
location_id integer PRIMARY KEY,
street_address varchar(64) NOT NULL,
postal_code varchar(16),
city varchar(64),
state_province varchar(64),
country_id varchar(2) REFERENCES COUNTRIES(country_id) NOT NULL
);
INSERT INTO LOCATIONS VALUES
(1000, '1297 Via Cola di Rie', '989', 'Roma', '', 'IT'),
(1100, '93091 Calle della Testa', '10934', 'Venice', '', 'IT'),
(1200, '2017 Shinjuku-ku', '1689', 'Tokyo', 'Tokyo Prefecture', 'JP'),
(1300, '9450 Kamiya-cho', '6823', 'Hiroshima', '', 'JP'),
(1400, '2014 Jabberwocky Rd', '26192', 'Southlake', 'Texas', 'US'),
(1500, '2011 Interiors Blvd', '99236', 'South San Francisco', 'California', 'US'),
(1600, '2007 Zagora St', '50090', 'South Brunswick', 'New Jersey', 'US'),
(1700, '2004 Charade Rd', '98199', 'Seattle', 'Washington', 'US'),
(1800, '147 Spadina Ave', 'M5V 2L7', 'Toronto', 'Ontario', 'CA'),
(1900, '6092 Boxwood St', 'YSW 9T2', 'Whitehorse', 'Yukon', 'CA'),
(2000, '40-5-12 Laogianggen', '190518', 'Beijing', '', 'CN'),
(2100, '1298 Vileparle (E)', '490231', 'Bombay', 'Maharashtra', 'IN'),
(2200, '12-98 Victoria Street', '2901', 'Sydney', 'New South Wales', 'AU'),
(2300, '198 Clementi North', '540198', 'Singapore', '', 'SG'),
(2400, '8204 Arthur St', '', 'London', '', 'UK'),
(2500, 'Magdalen Centre, The Oxford Science Park', 'OX9 9ZB', 'Oxford', 'Oxford', 'UK'),
(2600, '9702 Chester Road', '9629850293', 'Stretford', 'Manchester', 'UK'),
(2700, 'Schwanthalerstr. 7031', '80925', 'Munich', 'Bavaria', 'DE'),
(2800, 'Rua Frei Caneca 1360 ', '01307-002', 'Sao Paulo', 'Sao Paulo', 'BR'),
(2900, '20 Rue des Corps-Saints', '1730', 'Geneva', 'Geneve', 'CH'),
(3000, 'Murtenstrasse 921', '3095', 'Bern', 'BE', 'CH'),
(3100, 'Pieter Breughelstraat 837', '3029SK', 'Utrecht', 'Utrecht', 'NL');
-- DELETE FROM JOBS;
CREATE TABLE JOBS(
job_id varchar(16) PRIMARY KEY,
job_title varchar(64) NOT NULL UNIQUE,
min_salary numeric(8, 2) NOT NULL,
max_salary numeric(8, 2) NOT NULL
);
INSERT INTO jobs VALUES
('AD_PRES', 'President', 20080, 40000),
('AD_VP', 'Administration Vice President', 15000, 30000),
('AD_ASST', 'Administration Assistant', 3000, 6000),
('FI_MGR', 'Finance Manager', 8200, 16000),
('FI_ACCOUNT', 'Accountant', 4200, 9000),
('AC_MGR', 'Accounting Manager', 8200, 16000),
('AC_ACCOUNT', 'Public Accountant', 4200, 9000),
('SA_MAN', 'Sales Manager', 10000, 20080),
('SA_REP', 'Sales Representative', 6000, 12008),
('PU_MAN', 'Purchasing Manager', 8000, 15000),
('PU_CLERK', 'Purchasing Clerk', 2500, 5500),
('ST_MAN', 'Stock Manager', 5500, 8500),
('ST_CLERK', 'Stock Clerk', 2008, 5000),
('SH_CLERK', 'Shipping Clerk', 2500, 5500),
('IT_PROG', 'Programmer', 4000, 10000),
('MK_MAN', 'Marketing Manager', 9000, 15000),
('MK_REP', 'Marketing Representative', 4000, 9000),
('HR_REP', 'Human Resources Representative', 4000, 9000),
('PR_REP', 'Public Relations Representative', 4500, 10500);
-- DELETE FROM DEPARTMENTS;
CREATE TABLE EMPLOYEES
(
employee_id integer PRIMARY KEY,
first_name varchar(64) NOT NULL,
last_name varchar(64) NOT NULL,
email varchar(64) NOT NULL UNIQUE,
phone_integer varchar(64) NOT NULL,
hire_date timestamp NOT NULL,
job_id varchar(16) REFERENCES JOBS(job_id),
salary numeric(8, 2) NOT NULL,
commission_pct numeric(5, 2),
manager_id integer REFERENCES EMPLOYEES(employee_id),
department_id integer
);
-- DELETE FROM EMPLOYEES;
INSERT INTO employees VALUES(100, 'Steven', 'King', 'SKING', '515.123.4567', '17.06.2003', 'AD_PRES', 24000, NULL, NULL, 90);
INSERT INTO employees VALUES(101, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568', '21.09.2005', 'AD_VP', 17000, NULL, 100, 90);
INSERT INTO employees VALUES(102, 'Lex', 'De Haan', 'LDEHAAN', '515.123.4569', '13.01.2001', 'AD_VP', 17000, NULL, 100, 90);
INSERT INTO employees VALUES(103, 'Alexander', 'Hunold', 'AHUNOLD', '590.423.4567', '03.01.2006', 'IT_PROG', 9000, NULL, 102, 60);
INSERT INTO employees VALUES(104, 'Bruce', 'Ernst', 'BERNST', '590.423.4568', '21.05.2007', 'IT_PROG', 6000, NULL, 103, 60);
INSERT INTO employees VALUES(105, 'David', 'Austin', 'DAUSTIN', '590.423.4569', '25.06.2005', 'IT_PROG', 4800, NULL, 103, 60);
INSERT INTO employees VALUES(106, 'Valli', 'Pataballa', 'VPATABAL', '590.423.4560', '05.02.2006', 'IT_PROG', 4800, NULL, 103, 60);
INSERT INTO employees VALUES(107, 'Diana', 'Lorentz', 'DLORENTZ', '590.423.5567', '07.02.2007', 'IT_PROG', 4200, NULL, 103, 60);
INSERT INTO employees VALUES(108, 'Nancy', 'Greenberg', 'NGREENBE', '515.124.4569', '17.08.2002', 'FI_MGR', 12008, NULL, 101, 100);
INSERT INTO employees VALUES(109, 'Daniel', 'Faviet', 'DFAVIET', '515.124.4169', '16.08.2002', 'FI_ACCOUNT', 9000, NULL, 108, 100);
INSERT INTO employees VALUES(110, 'John', 'Chen', 'JCHEN', '515.124.4269', '28.09.2005', 'FI_ACCOUNT', 8200, NULL, 108, 100);
INSERT INTO employees VALUES(111, 'Ismael', 'Sciarra', 'ISCIARRA', '515.124.4369', '30.09.2005', 'FI_ACCOUNT', 7700, NULL, 108, 100);
INSERT INTO employees VALUES(112, 'Jose Manuel', 'Urman', 'JMURMAN', '515.124.4469', '07.03.2006', 'FI_ACCOUNT', 7800, NULL, 108, 100);
INSERT INTO employees VALUES(113, 'Luis', 'Popp', 'LPOPP', '515.124.4567', '07.12.2007', 'FI_ACCOUNT', 6900, NULL, 108, 100);
INSERT INTO employees VALUES(114, 'Den', 'Raphaely', 'DRAPHEAL', '515.127.4561', '07.12.2002', 'PU_MAN', 11000, NULL, 100, 30);
INSERT INTO employees VALUES(115, 'Alexander', 'Khoo', 'AKHOO', '515.127.4562', '18.05.2003', 'PU_CLERK', 3100, NULL, 114, 30);
INSERT INTO employees VALUES(116, 'Shelli', 'Baida', 'SBAIDA', '515.127.4563', '24.12.2005', 'PU_CLERK', 2900, NULL, 114, 30);
INSERT INTO employees VALUES(117, 'Sigal', 'Tobias', 'STOBIAS', '515.127.4564', '24.07.2005', 'PU_CLERK', 2800, NULL, 114, 30);
INSERT INTO employees VALUES(118, 'Guy', 'Himuro', 'GHIMURO', '515.127.4565', '15.11.2006', 'PU_CLERK', 2600, NULL, 114, 30);
INSERT INTO employees VALUES(119, 'Karen', 'Colmenares', 'KCOLMENA', '515.127.4566', '10.08.2007', 'PU_CLERK', 2500, NULL, 114, 30);
INSERT INTO employees VALUES(120, 'Matthew', 'Weiss', 'MWEISS', '650.123.1234', '18.07.2004', 'ST_MAN', 8000, NULL, 100, 50);
INSERT INTO employees VALUES(121, 'Adam', 'Fripp', 'AFRIPP', '650.123.2234', '10.04.2005', 'ST_MAN', 8200, NULL, 100, 50);
INSERT INTO employees VALUES(122, 'Payam', 'Kaufling', 'PKAUFLIN', '650.123.3234', '01.05.2003', 'ST_MAN', 7900, NULL, 100, 50);
INSERT INTO employees VALUES(123, 'Shanta', 'Vollman', 'SVOLLMAN', '650.123.4234', '10.10.2005', 'ST_MAN', 6500, NULL, 100, 50);
INSERT INTO employees VALUES(124, 'Kevin', 'Mourgos', 'KMOURGOS', '650.123.5234', '16.11.2007', 'ST_MAN', 5800, NULL, 100, 50);
INSERT INTO employees VALUES(125, 'Julia', 'Nayer', 'JNAYER', '650.124.1214', '16.07.2005', 'ST_CLERK', 3200, NULL, 120, 50);
INSERT INTO employees VALUES(126, 'Irene', 'Mikkilineni', 'IMIKKILI', '650.124.1224', '28.09.2006', 'ST_CLERK', 2700, NULL, 120, 50);
INSERT INTO employees VALUES(127, 'James', 'Landry', 'JLANDRY', '650.124.1334', '14.01.2007', 'ST_CLERK', 2400, NULL, 120, 50);
INSERT INTO employees VALUES(128, 'Steven', 'Markle', 'SMARKLE', '650.124.1434', '08.03.2008', 'ST_CLERK', 2200, NULL, 120, 50);
INSERT INTO employees VALUES(129, 'Laura', 'Bissot', 'LBISSOT', '650.124.5234', '20.08.2005', 'ST_CLERK', 3300, NULL, 121, 50);
INSERT INTO employees VALUES(130, 'Mozhe', 'Atkinson', 'MATKINSO', '650.124.6234', '30.10.2005', 'ST_CLERK', 2800, NULL, 121, 50);
INSERT INTO employees VALUES(131, 'James', 'Marlow', 'JAMRLOW', '650.124.7234', '16.02.2005', 'ST_CLERK', 2500, NULL, 121, 50);
INSERT INTO employees VALUES(132, 'TJ', 'Olson', 'TJOLSON', '650.124.8234', '10.04.2007', 'ST_CLERK', 2100, NULL, 121, 50);
INSERT INTO employees VALUES(133, 'Jason', 'Mallin', 'JMALLIN', '650.127.1934', '14.06.2004', 'ST_CLERK', 3300, NULL, 122, 50);
INSERT INTO employees VALUES(134, 'Michael', 'Rogers', 'MROGERS', '650.127.1834', '26.08.2006', 'ST_CLERK', 2900, NULL, 122, 50);
INSERT INTO employees VALUES(135, 'Ki', 'Gee', 'KGEE', '650.127.1734', '12.12.2007', 'ST_CLERK', 2400, NULL, 122, 50);
INSERT INTO employees VALUES(136, 'Hazel', 'Philtanker', 'HPHILTAN', '650.127.1634', '06.02.2008', 'ST_CLERK', 2200, NULL, 122, 50);
INSERT INTO employees VALUES(137, 'Renske', 'Ladwig', 'RLADWIG', '650.121.1234', '14.07.2003', 'ST_CLERK', 3600, NULL, 123, 50);
INSERT INTO employees VALUES(138, 'Stephen', 'Stiles', 'SSTILES', '650.121.2034', '26.10.2005', 'ST_CLERK', 3200, NULL, 123, 50);
INSERT INTO employees VALUES(139, 'John', 'Seo', 'JSEO', '650.121.2019', '12.02.2006', 'ST_CLERK', 2700, NULL, 123, 50);
INSERT INTO employees VALUES(140, 'Joshua', 'Patel', 'JPATEL', '650.121.1834', '06.04.2006', 'ST_CLERK', 2500, NULL, 123, 50);
INSERT INTO employees VALUES(141, 'Trenna', 'Rajs', 'TRAJS', '650.121.8009', '17.10.2003', 'ST_CLERK', 3500, NULL, 124, 50);
INSERT INTO employees VALUES(142, 'Curtis', 'Davies', 'CDAVIES', '650.121.2994', '29.01.2005', 'ST_CLERK', 3100, NULL, 124, 50);
INSERT INTO employees VALUES(143, 'Randall', 'Matos', 'RMATOS', '650.121.2874', '15.03.2006', 'ST_CLERK', 2600, NULL, 124, 50);
INSERT INTO employees VALUES(144, 'Peter', 'Vargas', 'PVARGAS', '650.121.2004', '09.07.2006', 'ST_CLERK', 2500, NULL, 124, 50);
INSERT INTO employees VALUES(145, 'John', 'Russell', 'JRUSSEL', '011.44.1344.429268', '01.10.2004', 'SA_MAN', 14000, '0.4', 100, 80);
INSERT INTO employees VALUES(146, 'Karen', 'Partners', 'KPARTNER', '011.44.1344.467268', '05.01.2005', 'SA_MAN', 13500, '0.3', 100, 80);
INSERT INTO employees VALUES(147, 'Alberto', 'Errazuriz', 'AERRAZUR', '011.44.1344.429278', '10.03.2005', 'SA_MAN', 12000, '0.3', 100, 80);
INSERT INTO employees VALUES(148, 'Gerald', 'Cambrault', 'GCAMBRAU', '011.44.1344.619268', '15.10.2007', 'SA_MAN', 11000, '0.3', 100, 80);
INSERT INTO employees VALUES(149, 'Eleni', 'Zlotkey', 'EZLOTKEY', '011.44.1344.429018', '29.01.2008', 'SA_MAN', 10500, '0.2', 100, 80);
INSERT INTO employees VALUES(150, 'Peter', 'Tucker', 'PTUCKER', '011.44.1344.129268', '30.01.2005', 'SA_REP', 10000, '0.3', 145, 80);
INSERT INTO employees VALUES(151, 'David', 'Bernstein', 'DBERNSTE', '011.44.1344.345268', '24.03.2005', 'SA_REP', 9500, '0.25', 145, 80);
INSERT INTO employees VALUES(152, 'Peter', 'Hall', 'PHALL', '011.44.1344.478968', '20.08.2005', 'SA_REP', 9000, '0.25', 145, 80);
INSERT INTO employees VALUES(153, 'Christopher', 'Olsen', 'COLSEN', '011.44.1344.498718', '30.03.2006', 'SA_REP', 8000, '0.2', 145, 80);
INSERT INTO employees VALUES(154, 'Nanette', 'Cambrault', 'NCAMBRAU', '011.44.1344.987668', '09.12.2006', 'SA_REP', 7500, '0.2', 145, 80);
INSERT INTO employees VALUES(155, 'Oliver', 'Tuvault', 'OTUVAULT', '011.44.1344.486508', '23.11.2007', 'SA_REP', 7000, '0.15', 145, 80);
INSERT INTO employees VALUES(156, 'Janette', 'King', 'JKING', '011.44.1345.429268', '30.01.2004', 'SA_REP', 10000, '0.35', 146, 80);
INSERT INTO employees VALUES(157, 'Patrick', 'Sully', 'PSULLY', '011.44.1345.929268', '04.03.2004', 'SA_REP', 9500, '0.35', 146, 80);
INSERT INTO employees VALUES(158, 'Allan', 'McEwen', 'AMCEWEN', '011.44.1345.829268', '01.08.2004', 'SA_REP', 9000, '0.35', 146, 80);
INSERT INTO employees VALUES(159, 'Lindsey', 'Smith', 'LSMITH', '011.44.1345.729268', '10.03.2005', 'SA_REP', 8000, '0.3', 146, 80);
INSERT INTO employees VALUES(160, 'Louise', 'Doran', 'LDORAN', '011.44.1345.629268', '15.12.2005', 'SA_REP', 7500, '0.3', 146, 80);
INSERT INTO employees VALUES(161, 'Sarath', 'Sewall', 'SSEWALL', '011.44.1345.529268', '03.11.2006', 'SA_REP', 7000, '0.25', 146, 80);
INSERT INTO employees VALUES(162, 'Clara', 'Vishney', 'CVISHNEY', '011.44.1346.129268', '11.11.2005', 'SA_REP', 10500, '0.25', 147, 80);
INSERT INTO employees VALUES(163, 'Danielle', 'Greene', 'DGREENE', '011.44.1346.229268', '19.03.2007', 'SA_REP', 9500, '0.15', 147, 80);
INSERT INTO employees VALUES(164, 'Mattea', 'Marvins', 'MMARVINS', '011.44.1346.329268', '24.01.2008', 'SA_REP', 7200, '0.1', 147, 80);
INSERT INTO employees VALUES(165, 'David', 'Lee', 'DLEE', '011.44.1346.529268', '23.02.2008', 'SA_REP', 6800, '0.1', 147, 80);
INSERT INTO employees VALUES(166, 'Sundar', 'Ande', 'SANDE', '011.44.1346.629268', '24.03.2008', 'SA_REP', 6400, '0.1', 147, 80);
INSERT INTO employees VALUES(167, 'Amit', 'Banda', 'ABANDA', '011.44.1346.729268', '21.04.2008', 'SA_REP', 6200, '0.1', 147, 80);
INSERT INTO employees VALUES(168, 'Lisa', 'Ozer', 'LOZER', '011.44.1343.929268', '11.03.2005', 'SA_REP', 11500, '0.25', 148, 80);
INSERT INTO employees VALUES(169, 'Harrison', 'Bloom', 'HBLOOM', '011.44.1343.829268', '23.03.2006', 'SA_REP', 10000, '0.2', 148, 80);
INSERT INTO employees VALUES(170, 'Tayler', 'Fox', 'TFOX', '011.44.1343.729268', '24.01.2006', 'SA_REP', 9600, '0.2', 148, 80);
INSERT INTO employees VALUES(171, 'William', 'Smith', 'WSMITH', '011.44.1343.629268', '23.02.2007', 'SA_REP', 7400, '0.15', 148, 80);
INSERT INTO employees VALUES(172, 'Elizabeth', 'Bates', 'EBATES', '011.44.1343.529268', '24.03.2007', 'SA_REP', 7300, '0.15', 148, 80);
INSERT INTO employees VALUES(173, 'Sundita', 'Kumar', 'SKUMAR', '011.44.1343.329268', '21.04.2008', 'SA_REP', 6100, '0.1', 148, 80);
INSERT INTO employees VALUES(174, 'Ellen', 'Abel', 'EABEL', '011.44.1644.429267', '11.05.2004', 'SA_REP', 11000, '0.3', 149, 80);
INSERT INTO employees VALUES(175, 'Alyssa', 'Hutton', 'AHUTTON', '011.44.1644.429266', '19.03.2005', 'SA_REP', 8800, '0.25', 149, 80);
INSERT INTO employees VALUES(176, 'Jonathon', 'Taylor', 'JTAYLOR', '011.44.1644.429265', '24.03.2006', 'SA_REP', 8600, '0.2', 149, 80);
INSERT INTO employees VALUES(177, 'Jack', 'Livingston', 'JLIVINGS', '011.44.1644.429264', '23.04.2006', 'SA_REP', 8400, '0.2', 149, 80);
INSERT INTO employees VALUES(178, 'Kimberely', 'Grant', 'KGRANT', '011.44.1644.429263', '24.05.2007', 'SA_REP', 7000, '0.15', 149, NULL);
INSERT INTO employees VALUES(179, 'Charles', 'Johnson', 'CJOHNSON', '011.44.1644.429262', '04.01.2008', 'SA_REP', 6200, '0.1', 149, 80);
INSERT INTO employees VALUES(180, 'Winston', 'Taylor', 'WTAYLOR', '650.507.9876', '24.01.2006', 'SH_CLERK', 3200, NULL, 120, 50);
INSERT INTO employees VALUES(181, 'Jean', 'Fleaur', 'JFLEAUR', '650.507.9877', '23.02.2006', 'SH_CLERK', 3100, NULL, 120, 50);
INSERT INTO employees VALUES(182, 'Martha', 'Sullivan', 'MSULLIVA', '650.507.9878', '21.06.2007', 'SH_CLERK', 2500, NULL, 120, 50);
INSERT INTO employees VALUES(183, 'Girard', 'Geoni', 'GGEONI', '650.507.9879', '03.02.2008', 'SH_CLERK', 2800, NULL, 120, 50);
INSERT INTO employees VALUES(184, 'Nandita', 'Sarchand', 'NSARCHAN', '650.509.1876', '27.01.2004', 'SH_CLERK', 4200, NULL, 121, 50);
INSERT INTO employees VALUES(185, 'Alexis', 'Bull', 'ABULL', '650.509.2876', '20.02.2005', 'SH_CLERK', 4100, NULL, 121, 50);
INSERT INTO employees VALUES(186, 'Julia', 'Dellinger', 'JDELLING', '650.509.3876', '24.06.2006', 'SH_CLERK', 3400, NULL, 121, 50);
INSERT INTO employees VALUES(187, 'Anthony', 'Cabrio', 'ACABRIO', '650.509.4876', '07.02.2007', 'SH_CLERK', 3000, NULL, 121, 50);
INSERT INTO employees VALUES(188, 'Kelly', 'Chung', 'KCHUNG', '650.505.1876', '14.06.2005', 'SH_CLERK', 3800, NULL, 122, 50);
INSERT INTO employees VALUES(189, 'Jennifer', 'Dilly', 'JDILLY', '650.505.2876', '13.08.2005', 'SH_CLERK', 3600, NULL, 122, 50);
INSERT INTO employees VALUES(190, 'Timothy', 'Gates', 'TGATES', '650.505.3876', '11.07.2006', 'SH_CLERK', 2900, NULL, 122, 50);
INSERT INTO employees VALUES(191, 'Randall', 'Perkins', 'RPERKINS', '650.505.4876', '19.12.2007', 'SH_CLERK', 2500, NULL, 122, 50);
INSERT INTO employees VALUES(192, 'Sarah', 'Bell', 'SBELL', '650.501.1876', '04.02.2004', 'SH_CLERK', 4000, NULL, 123, 50);
INSERT INTO employees VALUES(193, 'Britney', 'Everett', 'BEVERETT', '650.501.2876', '03.03.2005', 'SH_CLERK', 3900, NULL, 123, 50);
INSERT INTO employees VALUES(194, 'Samuel', 'McCain', 'SMCCAIN', '650.501.3876', '01.07.2006', 'SH_CLERK', 3200, NULL, 123, 50);
INSERT INTO employees VALUES(195, 'Vance', 'Jones', 'VJONES', '650.501.4876', '17.03.2007', 'SH_CLERK', 2800, NULL, 123, 50);
INSERT INTO employees VALUES(196, 'Alana', 'Walsh', 'AWALSH', '650.507.9811', '24.04.2006', 'SH_CLERK', 3100, NULL, 124, 50);
INSERT INTO employees VALUES(197, 'Kevin', 'Feeney', 'KFEENEY', '650.507.9822', '23.05.2006', 'SH_CLERK', 3000, NULL, 124, 50);
INSERT INTO employees VALUES(198, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', '21.06.2007', 'SH_CLERK', 2600, NULL, 124, 50);
INSERT INTO employees VALUES(199, 'Douglas', 'Grant', 'DGRANT', '650.507.9844', '13.01.2008', 'SH_CLERK', 2600, NULL, 124, 50);
INSERT INTO employees VALUES(200, 'Jennifer', 'Whalen', 'JWHALEN', '515.123.4444', '17.09.2003', 'AD_ASST', 4400, NULL, 101, 10);
INSERT INTO employees VALUES(201, 'Michael', 'Hartstein', 'MHARTSTE', '515.123.5555', '17.02.2004', 'MK_MAN', 13000, NULL, 100, 20);
INSERT INTO employees VALUES(202, 'Pat', 'Fay', 'PFAY', '603.123.6666', '17.08.2005', 'MK_REP', 6000, NULL, 201, 20);
INSERT INTO employees VALUES(203, 'Susan', 'Mavris', 'SMAVRIS', '515.123.7777', '07.06.2002', 'HR_REP', 6500, NULL, 101, 40);
INSERT INTO employees VALUES(204, 'Hermann', 'Baer', 'HBAER', '515.123.8888', '07.06.2002', 'PR_REP', 10000, NULL, 101, 70);
INSERT INTO employees VALUES(205, 'Shelley', 'Higgins', 'SHIGGINS', '515.123.8080', '07.06.2002', 'AC_MGR', 12008, NULL, 101, 110);
INSERT INTO employees VALUES(206, 'William', 'Gietz', 'WGIETZ', '515.123.8181', '07.06.2002', 'AC_ACCOUNT', 8300, NULL, 205, 110);
CREATE TABLE DEPARTMENTS
(
department_id integer PRIMARY KEY,
department_name varchar(64) NOT NULL UNIQUE,
manager_id integer REFERENCES EMPLOYEES(employee_id),
location_id integer REFERENCES LOCATIONS(location_id)
);
INSERT INTO departments VALUES
(10, 'Administration', 200, 1700),
(20, 'Marketing', 201, 1800),
(30, 'Purchasing', 114, 1700),
(40, 'Human Resources', 203, 2400),
(50, 'Shipping', 121, 1500),
(60, 'IT', 103, 1400),
(70, 'Public Relations', 204, 2700),
(80, 'Sales', 145, 2500),
(90, 'Executive', 100, 1700),
(100, 'Finance', 108, 1700),
(110, 'Accounting', 205, 1700),
(120, 'Treasury', NULL, 1700),
(130, 'Corporate Tax', NULL, 1700),
(140, 'Control And Credit', NULL, 1700),
(150, 'Shareholder Services', NULL, 1700),
(160, 'Benefits', NULL, 1700),
(170, 'Manufacturing', NULL, 1700),
(180, 'Construction', NULL, 1700),
(190, 'Contracting', NULL, 1700),
(200, 'Operations', NULL, 1700),
(210, 'IT Support', NULL, 1700),
(220, 'NOC', NULL, 1700),
(230, 'IT Helpdesk', NULL, 1700),
(240, 'Government Sales', NULL, 1700),
(250, 'Retail Sales', NULL, 1700),
(260, 'Recruiting', NULL, 1700),
(270, 'Payroll', NULL, 1700);
ALTER TABLE EMPLOYEES ADD CONSTRAINT DE FOREIGN KEY(department_id)
REFERENCES DEPARTMENTS(department_id);
CREATE TABLE JOB_HISTORY
(
employee_id integer REFERENCES EMPLOYEES(employee_id),
start_date timestamp,
PRIMARY KEY(employee_id, start_date),
end_date timestamp,
job_id varchar(16) REFERENCES JOBS(job_id) NOT NULL,
department_id integer REFERENCES DEPARTMENTS(department_id) NOT NULL
);
INSERT INTO job_history VALUES
(102, '13.01.2001', '24.07.2006', 'IT_PROG', 60),
(101, '21.09.1997', '27.10.2001', 'AC_ACCOUNT', 110),
(101, '28.10.2001', '15.03.2005', 'AC_MGR', 110),
(201, '17.02.2004', '19.12.2007', 'MK_REP', 20),
(114, '24.03.2006', '31.12.2007', 'ST_CLERK', 50),
(122, '01.01.2007', '31.12.2007', 'ST_CLERK', 50),
(200, '17.09.1995', '17.06.2001', 'AD_ASST', 90),
(176, '24.03.2006', '31.12.2006', 'SA_REP', 80),
(176, '01.01.2007', '31.12.2007', 'SA_MAN', 80),
(200, '01.07.2002', '31.12.2006', 'AC_ACCOUNT', 90);
+72
View File
@@ -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');
+32
View File
@@ -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 $$;
+25
View File
@@ -0,0 +1,25 @@
INSERT INTO A VALUES
(1,2),
(2,3);
INSERT INTO B VALUES
(1,1),
(2,3);
INSERT INTO C VALUES
(1,2,1,1),
(1,2,2,2),
(2,3,1,1),
(1,2,4,5);
SELECT a.F1, a.F2 FROM a,b,c
WHERE a.F1 = c.F1 AND a.F2 = c.F2 AND b.F3 = c.F3 AND b.F4 = c.F4
GROUP BY a.F1, a.F2 HAVING COUNT (a.F1) = (SELECT COUNT(F3) FROM b);
SELECT F1, F2 FROM C
WHERE F3 IN (SELECT F3 FROM B) AND F4 IN (SELECT F4 FROM B)
GROUP BY F1, F2 HAVING COUNT(*) = (
SELECT COUNT(*) FROM b
);
-97
View File
@@ -1,97 +0,0 @@
/* Вариант 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) и печатающие на
экран следующие данные: фамилия, имя, модифицированная заработная
плата. Модифицированная заработная плата получается следующим
образом: у первого по порядку сотрудника она округляется до сотен в
меньшую сторону, а у всех последующих сотрудников она сначала
увеличивается на остаток от округления, полученный от предыдущего
сотрудника, а затем округляется до сотен в меньшую сторону. */
CREATE OR REPLACE FUNCTION print_employees() RETURNS VOID 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;
END $$ LANGUAGE plpgsql;
SELECT print_employees();
-- 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();
+19
View File
@@ -0,0 +1,19 @@
-- Воспользуемся транзакцией
BEGIN;
INSERT INTO Cathegory(cath_name, root_id) VALUES
('Breakfast', NULL),
('Lunch', NULL),
('Dinner', NULL),
(),
(),
();
INSERT INTO Dish VALUES
(),
(),
(),
(),
(),
();
+209
View File
@@ -0,0 +1,209 @@
-- This script was generated by the ERD tool in pgAdmin 4.
-- Please log an issue at https://redmine.postgresql.org/projects/pgadmin4/issues/new if you find any bugs, including reproduction steps.
BEGIN;
DROP TABLE IF EXISTS public."Tech_Dish";
DROP TABLE IF EXISTS public."Source";
DROP TABLE IF EXISTS public."Link";
DROP TABLE IF EXISTS public."Dish";
DROP TABLE IF EXISTS public."Cathegory";
DROP TABLE IF EXISTS public."Tech";
DROP TABLE IF EXISTS public."Conversion";
DROP TABLE IF EXISTS public."Alternative Name";
DROP TABLE IF EXISTS public."Ingredients";
DROP TABLE IF EXISTS public."Methods";
CREATE TABLE IF NOT EXISTS public."Cathegory"
(
cath_id serial,
cath_name character varying(20) NOT NULL,
root_id integer,
PRIMARY KEY (cath_id),
CONSTRAINT "Name" UNIQUE (cath_name)
);
CREATE TABLE IF NOT EXISTS public."Dish"
(
dish_id serial,
cath_id integer NOT NULL,
name character varying(20) NOT NULL,
cook_time interval NOT NULL,
manual text NOT NULL,
PRIMARY KEY (dish_id),
CONSTRAINT "Name Dish" UNIQUE (name)
);
CREATE TABLE IF NOT EXISTS public."Link"
(
dish_id integer,
ingr_id integer,
method_id integer NOT NULL,
amount numeric(10) NOT NULL,
PRIMARY KEY (dish_id, ingr_id)
);
CREATE TABLE IF NOT EXISTS public."Ingredients"
(
ingr_id serial,
ingr_name character varying(20) NOT NULL,
ingr_descr text NOT NULL,
PRIMARY KEY (ingr_id),
CONSTRAINT "Inrg Name" UNIQUE (ingr_name)
);
CREATE TABLE IF NOT EXISTS public."Conversion"
(
ingr_id integer,
method1_id integer,
method2_id integer,
transit numeric NOT NULL,
PRIMARY KEY (ingr_id, method1_id, method2_id)
);
CREATE TABLE IF NOT EXISTS public."Methods"
(
method_id serial,
method_name character varying(20) NOT NULL,
standart boolean NOT NULL,
PRIMARY KEY (method_id),
UNIQUE (method_name)
);
CREATE TABLE IF NOT EXISTS public."Source"
(
dish_id integer,
picture serial NOT NULL,
PRIMARY KEY (dish_id)
);
CREATE TABLE IF NOT EXISTS public."Tech"
(
tech_id serial,
tech_name character varying(20) NOT NULL,
PRIMARY KEY (tech_id),
CONSTRAINT "Name Tech" UNIQUE (tech_name)
);
CREATE TABLE IF NOT EXISTS public."Tech_Dish"
(
"Tech_tech_id" integer,
"Dish_dish_id" integer,
PRIMARY KEY ("Tech_tech_id", "Dish_dish_id")
);
CREATE TABLE IF NOT EXISTS public."Alternative Name"
(
ingr_id integer,
alt_name character varying(20) NOT NULL,
PRIMARY KEY (ingr_id),
CONSTRAINT "Alt Name" UNIQUE (alt_name)
);
ALTER TABLE IF EXISTS public."Cathegory"
ADD FOREIGN KEY (root_id)
REFERENCES public."Cathegory" (cath_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
ALTER TABLE IF EXISTS public."Dish"
ADD FOREIGN KEY (cath_id)
REFERENCES public."Cathegory" (cath_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
ALTER TABLE IF EXISTS public."Link"
ADD FOREIGN KEY (ingr_id)
REFERENCES public."Ingredients" (ingr_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
ALTER TABLE IF EXISTS public."Link"
ADD FOREIGN KEY (dish_id)
REFERENCES public."Dish" (dish_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
ALTER TABLE IF EXISTS public."Conversion"
ADD FOREIGN KEY (method1_id)
REFERENCES public."Methods" (method_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
ALTER TABLE IF EXISTS public."Conversion"
ADD FOREIGN KEY (ingr_id)
REFERENCES public."Ingredients" (ingr_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
ALTER TABLE IF EXISTS public."Conversion"
ADD FOREIGN KEY (method2_id)
REFERENCES public."Methods" (method_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
ALTER TABLE IF EXISTS public."Source"
ADD FOREIGN KEY (dish_id)
REFERENCES public."Dish" (dish_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
ALTER TABLE IF EXISTS public."Tech_Dish"
ADD FOREIGN KEY ("Tech_tech_id")
REFERENCES public."Tech" (tech_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
ALTER TABLE IF EXISTS public."Tech_Dish"
ADD FOREIGN KEY ("Dish_dish_id")
REFERENCES public."Dish" (dish_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
ALTER TABLE IF EXISTS public."Alternative Name"
ADD FOREIGN KEY (ingr_id)
REFERENCES public."Ingredients" (ingr_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID;
END;
+331
View File
@@ -0,0 +1,331 @@
<mxfile host="app.diagrams.net" modified="2024-02-27T10:04:38.800Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36" etag="oQUbks3A1Cx2h5W1oJwQ" version="23.1.7" type="github">
<diagram name="Page-1" id="e56a1550-8fbb-45ad-956c-1786394a9013">
<mxGraphModel dx="1408" dy="748" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1100" pageHeight="850" background="none" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="2e49270ec7c68f3f-1" value="Table" style="swimlane;html=1;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fontFamily=Verdana;fontSize=14" parent="1" vertex="1">
<mxGeometry x="290" y="140" width="160" height="112" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-2" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-1" vertex="1">
<mxGeometry y="26" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-3" value="PK,FK1" style="shape=partialRectangle;fontStyle=1;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-2" vertex="1" connectable="0">
<mxGeometry width="56" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-4" value="row 2" style="shape=partialRectangle;top=0;left=0;right=0;bottom=1;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-1" vertex="1">
<mxGeometry y="56" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-5" value="PK,FK2" style="shape=partialRectangle;fontStyle=1;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-4" vertex="1" connectable="0">
<mxGeometry width="56" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-6" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-1" vertex="1">
<mxGeometry y="86" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-7" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-6" vertex="1" connectable="0">
<mxGeometry width="56" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-8" value="Table" style="swimlane;html=1;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fontFamily=Verdana;fontSize=14;swimlaneLine=1;" parent="1" vertex="1">
<mxGeometry x="570" y="154" width="160" height="144" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-9" value="uniqueId" style="shape=partialRectangle;top=0;left=0;right=0;bottom=1;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-8" vertex="1">
<mxGeometry y="26" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-10" value="PK" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-9" vertex="1" connectable="0">
<mxGeometry width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-11" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-8" vertex="1">
<mxGeometry y="56" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-12" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-11" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-13" value="row 2" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-8" vertex="1">
<mxGeometry y="82" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-14" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-13" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-15" value="row 3" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-8" vertex="1">
<mxGeometry y="108" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-16" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-15" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-17" value="" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-8" vertex="1">
<mxGeometry y="134" width="160" height="10" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-18" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-17" vertex="1" connectable="0">
<mxGeometry width="30" height="10" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-19" value="Table" style="swimlane;html=1;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fontFamily=Verdana;fontSize=14" parent="1" vertex="1">
<mxGeometry x="290" y="360" width="160" height="144" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-20" value="uniqueId" style="shape=partialRectangle;top=0;left=0;right=0;bottom=1;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-19" vertex="1">
<mxGeometry y="26" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-21" value="PK" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-20" vertex="1" connectable="0">
<mxGeometry width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-22" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-19" vertex="1">
<mxGeometry y="56" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-23" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-22" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-24" value="row 2" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-19" vertex="1">
<mxGeometry y="82" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-25" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-24" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-26" value="row 3" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-19" vertex="1">
<mxGeometry y="108" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-27" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-26" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-28" value="" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-19" vertex="1">
<mxGeometry y="134" width="160" height="10" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-29" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-28" vertex="1" connectable="0">
<mxGeometry width="30" height="10" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-30" value="Table" style="swimlane;html=1;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fontFamily=Verdana;fontSize=14" parent="1" vertex="1">
<mxGeometry x="580" y="409" width="160" height="144" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-31" value="uniqueId" style="shape=partialRectangle;top=0;left=0;right=0;bottom=1;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-30" vertex="1">
<mxGeometry y="26" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-32" value="PK" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-31" vertex="1" connectable="0">
<mxGeometry width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-33" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-30" vertex="1">
<mxGeometry y="56" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-34" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-33" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-35" value="row 2" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-30" vertex="1">
<mxGeometry y="82" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-36" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-35" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-37" value="row 3" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-30" vertex="1">
<mxGeometry y="108" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-38" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-37" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-39" value="" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-30" vertex="1">
<mxGeometry y="134" width="160" height="10" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-40" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-39" vertex="1" connectable="0">
<mxGeometry width="30" height="10" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-41" value="Table" style="swimlane;html=1;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fontFamily=Verdana;fontSize=14" parent="1" vertex="1">
<mxGeometry x="890" y="274" width="160" height="112" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-42" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-41" vertex="1">
<mxGeometry y="26" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-43" value="PK,FK1" style="shape=partialRectangle;fontStyle=1;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-42" vertex="1" connectable="0">
<mxGeometry width="56" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-44" value="row 2" style="shape=partialRectangle;top=0;left=0;right=0;bottom=1;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-41" vertex="1">
<mxGeometry y="56" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-45" value="PK,FK2" style="shape=partialRectangle;fontStyle=1;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-44" vertex="1" connectable="0">
<mxGeometry width="56" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-46" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-41" vertex="1">
<mxGeometry y="86" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-47" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-46" vertex="1" connectable="0">
<mxGeometry width="56" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-48" value="Table" style="swimlane;html=1;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fontFamily=Verdana;fontSize=14" parent="1" vertex="1">
<mxGeometry x="290" y="580" width="160" height="112" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-49" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-48" vertex="1">
<mxGeometry y="26" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-50" value="PK,FK1" style="shape=partialRectangle;fontStyle=1;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-49" vertex="1" connectable="0">
<mxGeometry width="56" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-51" value="row 2" style="shape=partialRectangle;top=0;left=0;right=0;bottom=1;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-48" vertex="1">
<mxGeometry y="56" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-52" value="PK,FK2" style="shape=partialRectangle;fontStyle=1;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-51" vertex="1" connectable="0">
<mxGeometry width="56" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-53" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-48" vertex="1">
<mxGeometry y="86" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-54" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-53" vertex="1" connectable="0">
<mxGeometry width="56" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-55" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=ERoneToMany;startArrow=ERmandOne;labelBackgroundColor=none;fontFamily=Verdana;fontSize=14;entryX=0;entryY=0.5;exitX=0;exitY=0.5;" parent="1" source="2e49270ec7c68f3f-20" target="2e49270ec7c68f3f-6" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="100" y="430" as="sourcePoint" />
<mxPoint x="200" y="330" as="targetPoint" />
<Array as="points">
<mxPoint x="250" y="401" />
<mxPoint x="250" y="239" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2e49270ec7c68f3f-56" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=ERzeroToMany;endFill=1;startArrow=ERzeroToMany;labelBackgroundColor=none;fontFamily=Verdana;fontSize=14;entryX=0;entryY=0.5;exitX=0;exitY=0.5;" parent="1" source="2e49270ec7c68f3f-49" target="2e49270ec7c68f3f-26" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="120" y="650" as="sourcePoint" />
<mxPoint x="220" y="550" as="targetPoint" />
<Array as="points">
<mxPoint x="250" y="621" />
<mxPoint x="250" y="481" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2e49270ec7c68f3f-57" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=ERmany;startArrow=ERmany;labelBackgroundColor=none;fontFamily=Verdana;fontSize=14;entryX=1;entryY=0.5;exitX=0;exitY=0.383;exitPerimeter=0;" parent="1" source="2e49270ec7c68f3f-11" target="2e49270ec7c68f3f-2" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="560" y="220" as="sourcePoint" />
<mxPoint x="580" y="310" as="targetPoint" />
<Array as="points">
<mxPoint x="510" y="220" />
<mxPoint x="510" y="181" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2e49270ec7c68f3f-58" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=ERzeroToMany;startArrow=ERmandOne;labelBackgroundColor=none;fontFamily=Verdana;fontSize=14;entryX=0;entryY=0.308;entryPerimeter=0;exitX=0;exitY=0.5;" parent="1" source="2e49270ec7c68f3f-31" target="2e49270ec7c68f3f-15" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="470" y="420" as="sourcePoint" />
<mxPoint x="570" y="320" as="targetPoint" />
<Array as="points">
<mxPoint x="540" y="450" />
<mxPoint x="540" y="270" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2e49270ec7c68f3f-60" value="" style="edgeStyle=entityRelationEdgeStyle;html=1;endArrow=ERzeroToOne;startArrow=ERmandOne;labelBackgroundColor=none;fontFamily=Verdana;fontSize=14;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" parent="1" source="2e49270ec7c68f3f-49" target="2e49270ec7c68f3f-35" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="600" y="720" as="sourcePoint" />
<mxPoint x="700" y="620" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="2e49270ec7c68f3f-63" value="" style="edgeStyle=entityRelationEdgeStyle;html=1;endArrow=ERzeroToMany;startArrow=ERzeroToOne;labelBackgroundColor=none;fontFamily=Verdana;fontSize=14;entryX=0;entryY=0.5;exitX=1;exitY=0.5;" parent="1" source="2e49270ec7c68f3f-31" target="2e49270ec7c68f3f-42" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="850" y="600" as="sourcePoint" />
<mxPoint x="950" y="500" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="2e49270ec7c68f3f-64" value="Table" style="swimlane;html=1;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fontFamily=Verdana;fontSize=14" parent="1" vertex="1">
<mxGeometry x="890" y="416" width="160" height="112" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-65" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-64" vertex="1">
<mxGeometry y="26" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-66" value="PK,FK1" style="shape=partialRectangle;fontStyle=1;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-65" vertex="1" connectable="0">
<mxGeometry width="56" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-67" value="row 2" style="shape=partialRectangle;top=0;left=0;right=0;bottom=1;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-64" vertex="1">
<mxGeometry y="56" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-68" value="PK,FK2" style="shape=partialRectangle;fontStyle=1;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-67" vertex="1" connectable="0">
<mxGeometry width="56" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-69" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-64" vertex="1">
<mxGeometry y="86" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-70" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-69" vertex="1" connectable="0">
<mxGeometry width="56" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-71" value="Table" style="swimlane;html=1;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fontFamily=Verdana;fontSize=14" parent="1" vertex="1">
<mxGeometry x="890" y="550" width="160" height="112" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-72" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-71" vertex="1">
<mxGeometry y="26" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-73" value="PK,FK1" style="shape=partialRectangle;fontStyle=1;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-72" vertex="1" connectable="0">
<mxGeometry width="56" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-74" value="row 2" style="shape=partialRectangle;top=0;left=0;right=0;bottom=1;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-71" vertex="1">
<mxGeometry y="56" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-75" value="PK,FK2" style="shape=partialRectangle;fontStyle=1;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-74" vertex="1" connectable="0">
<mxGeometry width="56" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-76" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=60;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-71" vertex="1">
<mxGeometry y="86" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-77" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-76" vertex="1" connectable="0">
<mxGeometry width="56" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-78" value="" style="edgeStyle=entityRelationEdgeStyle;html=1;endArrow=ERzeroToMany;startArrow=ERzeroToOne;labelBackgroundColor=none;fontFamily=Verdana;fontSize=14;entryX=0;entryY=0.5;exitX=1;exitY=0.5;" parent="1" source="2e49270ec7c68f3f-33" target="2e49270ec7c68f3f-65" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="749.7647058823532" y="459.52941176470586" as="sourcePoint" />
<mxPoint x="900.3529411764707" y="325.41176470588243" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="2e49270ec7c68f3f-79" value="" style="edgeStyle=entityRelationEdgeStyle;html=1;endArrow=ERzeroToMany;startArrow=ERzeroToOne;labelBackgroundColor=none;fontFamily=Verdana;fontSize=14;entryX=0;entryY=0.5;exitX=1;exitY=0.5;" parent="1" source="2e49270ec7c68f3f-37" target="2e49270ec7c68f3f-74" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="759.7647058823532" y="469.52941176470586" as="sourcePoint" />
<mxPoint x="910.3529411764707" y="335.41176470588243" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="2e49270ec7c68f3f-80" value="Table" style="swimlane;html=1;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fontFamily=Verdana;fontSize=14" parent="1" vertex="1">
<mxGeometry x="30" y="358" width="160" height="144" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-81" value="uniqueId" style="shape=partialRectangle;top=0;left=0;right=0;bottom=1;html=1;align=left;verticalAlign=middle;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;fontStyle=5;" parent="2e49270ec7c68f3f-80" vertex="1">
<mxGeometry y="26" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-82" value="PK" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-81" vertex="1" connectable="0">
<mxGeometry width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-83" value="row 1" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-80" vertex="1">
<mxGeometry y="56" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-84" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-83" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-85" value="row 2" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-80" vertex="1">
<mxGeometry y="82" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-86" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-85" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-87" value="row 3" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-80" vertex="1">
<mxGeometry y="108" width="160" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-88" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-87" vertex="1" connectable="0">
<mxGeometry width="30" height="26" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-89" value="" style="shape=partialRectangle;top=0;left=0;right=0;bottom=0;html=1;align=left;verticalAlign=top;fillColor=none;spacingLeft=34;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;" parent="2e49270ec7c68f3f-80" vertex="1">
<mxGeometry y="134" width="160" height="10" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-90" value="" style="shape=partialRectangle;top=0;left=0;bottom=0;html=1;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;" parent="2e49270ec7c68f3f-89" vertex="1" connectable="0">
<mxGeometry width="30" height="10" as="geometry" />
</mxCell>
<mxCell id="2e49270ec7c68f3f-91" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=ERzeroToOne;endFill=1;labelBackgroundColor=none;fontFamily=Verdana;fontSize=14;entryX=0;entryY=0.5;exitX=1;exitY=0.5;" parent="1" source="2e49270ec7c68f3f-81" target="2e49270ec7c68f3f-2" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="70" y="300" as="sourcePoint" />
<mxPoint x="170" y="200" as="targetPoint" />
<Array as="points">
<mxPoint x="230" y="399" />
<mxPoint x="230" y="181" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2e49270ec7c68f3f-92" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=ERzeroToOne;endFill=1;labelBackgroundColor=none;fontFamily=Verdana;fontSize=14;entryX=0;entryY=0.5;exitX=1;exitY=0.5;" parent="1" source="2e49270ec7c68f3f-87" target="2e49270ec7c68f3f-53" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="200.35294117647072" y="408.9411764705883" as="sourcePoint" />
<mxPoint x="300.3529411764707" y="191.2941176470589" as="targetPoint" />
<Array as="points">
<mxPoint x="220" y="479" />
<mxPoint x="220" y="679" />
</Array>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
+10
View File
@@ -0,0 +1,10 @@
<mxfile host="app.diagrams.net" modified="2024-03-12T07:24:36.795Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36" version="24.0.4" etag="nRJU5VsyoiY_x4ttw_To" type="github">
<diagram name="Страница — 1" id="RiZwUzDFywCK9l7nr0ti">
<mxGraphModel>
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
</root>
</mxGraphModel>
</diagram>
</mxfile>