- •1. Вступ
- •2. Коротка історія PostgreSql
- •3. Оновні концепції роботи з PostgreSql
- •3.1 Створення таблиць
- •3.1.1 Типи даних
- •3.2 Внесення даних у таблицю
- •3.3 Редагування таблиць
- •3.4 Обмеження
- •Immediate – всі або конкретне обмеження перевіряються наприкінці кожної команди.
- •3.5 Послідовності
- •3.6 Запити
- •3.7 Об'єднання таблиць (Join)
- •3.8 Агрегатні функції
- •3.9 Курсори sql
- •4. Основні елементи мови pLpgSql
- •4.1 Структура мови, функції користувача.
- •4.2 Розгалуження, цикли, масиви.
- •4.3 Курсори
- •5. Практична частина
- •Регіон: код регіону, назва регіону; Область: код регіону, код області, назва області;
- •5.1 Завдання 1
- •5.2 Завдання 2
- •5.3 Завдання 3
- •5.3 Завдання 3
- •5.3 Завдання 3
- •5.4 Завдання 4
- •5.4 Задача 4
- •5.4 Задача 7
- •5.4 Задача 9
- •6. Висновки
- •7. Список використаної літератури
5.3 Завдання 3
Задача 5
Виготовити запит про розподіл кількості нафтових областей по категоріях. Навпроти назв регіонів і областей установити значення кількості нафтових баз для кожної категорії.
Розв’язок задачі
SELECT
oblast.n_obl, region.n_reg, count(baza.kod_b)
FROM
baza INNER JOIN oblast INNER JOIN region
ON region.kod_reg = oblast.kod_reg
ON oblast.kod_obl= baza.kod_obl,
paluvo WHERE paluvo.kod_b = baza.kod_b
GROUP BY region.n_reg, oblast.n_obl;
Результати запиту

5.3 Завдання 3
Задача 8
Виготовити запити з відомостями про всі нафтобази. Забезпечити відповідний напис для баз про ввивіз палива в листопаді. Використовуючи курсори.
Розв’язок задачі
begin;
DECLARE
curs CURSOR FOR
SELECT *, CASE WHEN OR extract(month from paluvo.data)=11
THEN 'Вивіз палива!' END AS vuviz FROM paluvo
INNER JOIN baza ON baza.kod_b=paluvo.kod_b
INNER JOIN oblast ON oblast.kod_obl = baza.kod_obl
INNER JOIN region ON region.kod_reg=oblast.kod_reg;
FETCH 13 FROM curs;

5.4 Завдання 4
5.4 Задача 4
Виготовити звіт про розподіл кількості нафтобаз, областей по категоріях. Навпроти назв областей установити назви нафтобаз, розділених пробілом, установити значення кількості нафтобаз у даній області.
Розв'язок задачі
CREATE or REPLACE function zvit4() returns text
AS
$$
DECLARE
rec_o oblast %rowtype;
rec_b baza %rowtype;
rec_r region %rowtype ;
_text text = '';
prev_region region.n_reg %type := '';
prev_b_name baza.n_b %type := '';
_count integer := 0;
BEGIN
FOR rec_r IN SELECT * FROM region ORDER BY region.n_reg
LOOP
FOR rec_o IN SELECT * FROM oblast ORDER BY oblast.n_obl
LOOP
IF rec_r.kod_reg = rec_o.kod_reg
THEN
FOR rec_b IN SELECT * FROM baza
LOOP
IF rec_o.kod_obl = rec_b.kod_obl
THEN
IF rec_r.n_reg != prev_region
THEN
IF rec_b.n_b < prev_b_name
THEN
_text := _text || rpad(rec_o.n_obl, 70, '_') || rec_b.n_b|| E'\n';
END IF;
_count := _count + 1;
ELSE
IF _count > 0
THEN
_text := _text||repeat(' ', 30)||'Кількість баз : '||TO_CHAR(_count, '9')||E'\n';
END IF;
_text := _text||E'\n'||repeat(' ', 30)||' '||rec_r.n_reg||E'\n'||
rpad(rec_o.n_obl, 70, '_')||rec_b.n_b||E'\n';
_count:=1;
END IF;
prev_region := rec_r.n_reg;
prev_b_name := rec_b.n_b;
END IF;
END LOOP;
END IF;
END LOOP;
END LOOP;
_text := _text ||repeat(' ', 30)||'Кількість родовищ : '||TO_CHAR(_count, '9')||E'\n';
return _text;
END;
$$
LANGUAGE plpgsql;
select zvit4();
Результат задачі

5.4 Задача 7
Утворити запит про вартість палива яке є на нафтобазі. Використовуючи курсори.
begin;
DECLARE
curs CURSOR FOR
SELECT oblast.n_obl, baza.n_b, sum(paluvo.kilk_b*10.65+paluvo.kilk_d*6.45+paluvo.kilk_m*2.45),text('грн'),
extract (month FROM data) AS mis, extract (year FROM data) AS rik FROM
paluvo INNER JOIN baza INNER JOIN oblast
ON (oblast.kod_obl=baza.kod_obl)
ON (baza.kod_b=paluvo.kod_b)
GROUP BY oblast.n_obl,baza.n_b, mis, rik
ORDER BY oblast.n_obl;
FETCH 13 FROM curs;
Результат:

