mirror of
https://github.com/ada-dmitry/DB.mephi_ada.git
synced 2026-09-24 08:00:16 +00:00
Merge branch 'main' of https://github.com/ada-dmitry/DB.mephi_ada
This commit is contained in:
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
@@ -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
|
||||
);
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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');
|
||||
|
||||
@@ -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);
|
||||
@@ -0,0 +1,72 @@
|
||||
--2
|
||||
SELECT *
|
||||
FROM bd_departments
|
||||
WHERE LENGTH(street) = POWER(SQRT(75 + LENGTH(street)), 2) / 4;
|
||||
|
||||
INSERT INTO bd_departments VALUES
|
||||
(35,'meow', 407596, 'aaaaaaaaaaaaaaaaaaaaaaaaa', 2, 'MSK');
|
||||
--4
|
||||
CREATE TABLE employees_backup AS
|
||||
SELECT *,
|
||||
CASE
|
||||
WHEN random() < 0.5 THEN 'Active'
|
||||
ELSE 'Inactive'
|
||||
END AS employee_status
|
||||
FROM bd_employees;
|
||||
SELECT * FROM employees_backup;
|
||||
--5
|
||||
SELECT e.employee_id, e.first_name, e.last_name, e.manager_id
|
||||
FROM employees e
|
||||
JOIN employees m ON e.manager_id = m.employee_id
|
||||
WHERE LENGTH(m.last_name) > 6;
|
||||
|
||||
--3--
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
BEGIN
|
||||
RAISE NOTICE 'Шахматная доска:';
|
||||
CALL chess('z9', 'C');
|
||||
|
||||
|
||||
RAISE NOTICE 'Размещение фигуры А на клетке A5:';
|
||||
CALL chess('a5', ' A ');
|
||||
|
||||
|
||||
RAISE NOTICE 'Размещение фигуры У на клетке H4:';
|
||||
CALL chess('h4', ' Y ');
|
||||
|
||||
|
||||
END $$;
|
||||
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE chess(pos varchar, bukva char) AS $$
|
||||
DECLARE
|
||||
board text;
|
||||
queen_col integer;
|
||||
queen_row integer;
|
||||
BEGIN
|
||||
queen_col := ascii(substring(pos from 1 for 1)) - 96;
|
||||
queen_row := substring(pos from 2)::integer;
|
||||
|
||||
FOR i IN 1..8 LOOP
|
||||
board := '';
|
||||
|
||||
FOR j IN 1..8 LOOP
|
||||
IF i = queen_row AND j = queen_col THEN
|
||||
board := board || bukva;
|
||||
ELSE
|
||||
IF (i + j) % 2 = 0 THEN
|
||||
board := board || ' б ';
|
||||
ELSE
|
||||
board := board || ' ч ';
|
||||
END IF;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE '%', board;
|
||||
END LOOP;
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
SELECT chess('c3');
|
||||
@@ -0,0 +1,32 @@
|
||||
DO $$
|
||||
DECLARE
|
||||
board CHAR(8)[][] := ARRAY[
|
||||
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
|
||||
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
|
||||
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
|
||||
ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
|
||||
ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б']
|
||||
];
|
||||
|
||||
BEGIN
|
||||
RAISE NOTICE 'Шахматная доска:';
|
||||
FOR i IN REVERSE 1..8 LOOP
|
||||
RAISE NOTICE '%', board[i];
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE 'Размещение фигуры А на клетке A5:';
|
||||
board[8 - 5 + 1][ASCII('A') - 64] := 'A';
|
||||
FOR i IN REVERSE 1..8 LOOP
|
||||
RAISE NOTICE '%', board[i];
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE 'Размещение фигуры У на клетке H4:';
|
||||
board[8 - ч + 1][ASCII('H') - 64] := 'У';
|
||||
FOR i IN REVERSE 1..8 LOOP
|
||||
RAISE NOTICE '%', board[i];
|
||||
END LOOP;
|
||||
|
||||
END $$;
|
||||
@@ -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
|
||||
);
|
||||
@@ -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();
|
||||
@@ -0,0 +1,19 @@
|
||||
-- Воспользуемся транзакцией
|
||||
|
||||
BEGIN;
|
||||
|
||||
INSERT INTO Cathegory(cath_name, root_id) VALUES
|
||||
('Breakfast', NULL),
|
||||
('Lunch', NULL),
|
||||
('Dinner', NULL),
|
||||
(),
|
||||
(),
|
||||
();
|
||||
|
||||
INSERT INTO Dish VALUES
|
||||
(),
|
||||
(),
|
||||
(),
|
||||
(),
|
||||
(),
|
||||
();
|
||||
@@ -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
@@ -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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user