- •Регіон: код регіону, назва регіону;
- •Область: код регіону, код області, назва області;
- •Родовище: код області, код родовища, назва родовища, геологічні запаси, категорія родовища;
- •Запаси: код родовища, видобувні запаси, дата представлення даних.
- •Завдання 1
- •Розв’язок
- •Завдання 2
- •Задача 3.2
- •Результати виконання завдання
- •Завдання 3
- •Створення тригера на delete
- •Створення представлень (view) та правил до них
Результати виконання завдання




Завдання 3
Виготовити запит про розподіл кількості родовищ областей по категоріях. Навпроти назв регіонів і областей, розділених пробілом, установити значення кількості родовищ для кожної категорії.
SELECT
zone.name, region.name, depository.category, count(depository.id)
FROM
depository INNER JOIN zone INNER JOIN region
ON region.id = zone.region_id
ON zone.id = depository.zone_id,
reserves WHERE reserves.depository_id = depository.id
GROUP BY depository.category, region.name, zone.name;

Задача 3.2
Побудувати запит про динаміку зміни видобувних запасів нафти протягом останніх 15 років заданого родовища. Додати назву цього родовища
SELECT
depository.name,
reserves.recoverable_reserves,
reserves.date
FROM reserves INNER JOIN depository
ON depository.id = reserves.depository_id
WHERE
extract(YEAR FROM current_date) < extract(YEAR FROM reserves.date) + 15
GROUP BY name, recoverable_reserves,date ;

Задача 3.3
Виготовити запити для перегляду вмісту таблиць зі всіма даними.
SELECT
region.name , zone.name, depository.name, depository.reserves, depository.category, reserves.recoverable_reserves, reserves.date
FROM
reserves INNER JOIN depository INNER JOIN zone INNER JOIN region
ON region.id = zone.region_id
ON zone.id = depository.zone_id
ON depository.id = reserves.depository_id;

Створення транзакцій
SELECT * FROM oblik;
3 5 "2011-09-10" 3
1 9 "2011-10-20" 5
BEGIN;
INSERT INTO oblik VALUES(2, 2, '2002-02-22', 2);
SELECT * FROM oblik;
3 5 "2011-09-10" 3
1 9 "2011-10-20" 5
2 2 "2002-02-22" 2
ROLLBACK;
SELECT * FROM oblik;
3 5 "2011-09-10" 3
1 9 "2011-10-20" 5
BEGIN;
I
З використання
точок збереження
SELECT * FROM oblik;
1 9 "2011-10-20" 5
2 2 "2002-02-22" 2
SAVEPOINT a;
INSERT INTO oblik VALUES(3, 3, '2003-03-23', 3);
SELECT * FROM oblik;
1 9 "2011-10-20" 5
2 2 "2002-02-22" 2
3 3 "2003-03-23" 3
SAVEPOINT b;
INSERT INTO oblik VALUES(4, 4, '2004-04-24',4);
SELECT * FROM oblik;
1 9 "2011-10-20" 5
2 2 "2002-02-22" 2
3 3 "2003-03-23" 3
4 4 "2004-04-24" 4
ROLLBACK TO a;
SELECT * FROM oblik;
1 9 "2011-10-20" 5
2 2 "2002-02-22" 2
Створення тригера на INSERT
Нехай маємо таблицю books з декількома полями. Необхідно створити тригер, який б запобігав вставлянню рядків в якому поле rozmir є від’ємним, тобто <0.
Створення тригерної функції (варіант 1):
CREATE FUNCTION trig () RETURNS trigger AS '
begin
if(new.rozmir<0)then
raise notice ‘Значення поля не може бути відємним’;
return null;
else return new;
end if;
end;
' LANGUAGE plpgsql;
Створення тригерної функції (варіант 2):
CREATE FUNCTION trig () RETURNS trigger AS '
begin
if (new.rozmir<0) then
raise notice ‘Значення поля не може бути відємним’;
new = null;
end if;
return new;
end;
' LANGUAGE plpgsql;
Створення тригера
CREATE TRIGGER tr BEFORE INSERT ON books FOR EACH ROW EXECUTE PROCEDURE trig()
Перевірка роботи тригера
INSERTINTObooksvalues(‘Автор’, ‘книга’, -15, 12, 14)
