Язык PSQL
Цель
Изучить возможности языка PSQL и научится создавать хранимые процедуры, хранимые функции и триггеры различных событий.
Порядок выполнения
1. Используя БД employee.fdb разработайте следующие объекты БД.
2. Создайте хранимую функцию, которая проверяет, является ли число простым.
Например, запрос
SELECT IS_SIMPLE(NULL) FROM RDB$DATABASE
UNION ALL
SELECT IS_SIMPLE(2) FROM RDB$DATABASE
UNION ALL
SELECT IS_SIMPLE(4) FROM RDB$DATABASE
UNION ALL
SELECT IS_SIMPLE(17) FROM RDB$DATABASE
должен вернуть
| IS_SIMPLE |
|---|
| NULL |
| TRUE |
| FALSE |
| TRUE |
3. Создайте функцию, которая рекурсивно вычисляет факториал своего аргумента.
Запрос
SELECT FACT(0) FROM RDB$DATABASE
UNION ALL
SELECT FACT(1) FROM RDB$DATABASE
UNION ALL
SELECT FACT(2) FROM RDB$DATABASE
UNION ALL
SELECT FACT(3) FROM RDB$DATABASE
UNION ALL
SELECT FACT(9) FROM RDB$DATABASE
должен вернуть
| FACT |
|---|
| 1 |
| 1 |
| 2 |
| 6 |
| 362880 |
4. Создайте хранимую процедуру, которая вычисляет факториалы чисел от 0 до 9 включительно и использует функцию задания 2.
Запрос
SELECT * FROM FACT10
должен вернуть
| I | F |
|---|---|
| 0 | 1 |
| 1 | 1 |
| 2 | 2 |
| 3 | 6 |
| 4 | 24 |
| 5 | 120 |
| 6 | 720 |
| 7 | 5040 |
| 8 | 40320 |
| 9 | 362880 |
5. Создайте хранимую процедуру, которая удаляет строки указанной таблицы, содержащие дубликаты в указанном столбце.
Например, для таблицы
CREATE TABLE DUP (
I INTEGER,
S VARCHAR(2));
Содержащей данные с дубликатами в столбце I,
| I | S |
|---|---|
| 1 | a |
| 1 | b |
| 2 | b |
| 2 | c |
| 3 | c |
| 4 | d |
| 5 | e |
Вызов процедуры
EXECUTE PROCEDURE DEDUP();
Должен оставить в таблице только эти строки
| I | S |
|---|---|
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | e |
6. Сделайте триггер на логирование удаления записи в таблице EMPLOYEE.
Триггер должен сохранять в таблицу EMP_HISTORY дату удаления и полное имя сотрудника.
Тогда после выполнения запроса
UPDATE EMPLOYEE SET LAST_NAME = 'SMITH' WHERE EMP_NO = 2;
Таблица EMP_HISTORY должна содержать
| OLDLASTNAME | NEWLASTNAME | DEL_TIME |
|---|---|---|
| Nelson | Smith | 2025-04-12T23:29:44.414 |
7. Сделайте триггер, которые не дает подключаться в четные минуты
При попытке подключения в четную минуту, пользователь должен получать ошибку Bad time.