reboot rep

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