Скачиваний:
1
Добавлен:
31.05.2023
Размер:
6.73 Кб
Скачать
CREATE OR REPLACE FUNCTION ins_enum_value(num INTEGER, enum_val_name VARCHAR(50), en_val_short_name VARCHAR(10),
enum_name VARCHAR(50))
returns VARCHAR(30)
/*функция: Добавление нового значения заданного перечисления.
вход: num - номер нового значения,
enun_val_name - название значения перечисления,
en_val_short_name - короткое название,
enum_name - название перечисления.
выход: сообщение об успехе/неуспехе операции
эффекты: */
as
$$
DECLARE
ENUM_ID INTEGER;
begin
SELECT * FROM get_enum_id(enum_name) INTO ENUM_ID;

IF ENUM_ID is NULL then
RETURN 'This enum does not exist!';
end if;

--Если такое значения для указанного enum уже есть.
IF enum_val_name in (SELECT NAME FROM get_enum_list(enum_name)) then
RETURN 'This enum value already exists!';
end if;

--Авто инкремент номера, если он не был задан
if num is null then
SELECT * FROM get_enum_min_value(enum_name) INTO num;
WHILE num in (SELECT * FROM get_enum_numbers(enum_name))
LOOP
num = num + 1;
end loop;
end if;

--Если num был указан пользователем, проверяем, что такого номера еще нет
IF num in (SELECT * FROM get_enum_numbers(enum_name)) then
RETURN 'This number already exists!';
end if;

INSERT INTO enum_value(ID_ENUM, VALUE, NAME, SHORT_NAME)
VALUES (ENUM_ID, num, enum_val_name, en_val_short_name);
RETURN 'Done!';
end;
$$
LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION delete_enum_value(enum_name VARCHAR(50), enum_value_name VARCHAR(50))
/*функция: Функция удаления значения списка перечислений
вход:enum_name - название списка перечислений, enum_value - название значения
выход: Сообщение о результате операции
эффекты:*/

returns VARCHAR(30)
AS
$$
DECLARE
ENUM_ID INTEGER;
BEGIN
SELECT * FROM get_enum_id(enum_name) INTO ENUM_ID;

IF ENUM_ID is NULL then
RETURN 'This enum does not exist!';
end if;

IF enum_value_name not in (SELECT NAME
FROM ENUM_VALUE
WHERE id_enum = ENUM_ID) then
RETURN 'This enum value does not exist!';
end if;

DELETE
FROM ENUM_VALUE
WHERE NAME = enum_value_name;
RETURN 'Done!';
END
$$
LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION delete_enum_value_on_id(value_id INTEGER)
/*функция: Функция удаления значения списка перечислений по его id
вход:value_id - id значения
выход: Сообщение о результате операции
эффекты:*/

returns VARCHAR(30)
AS
$$

BEGIN

IF value_id not in (SELECT id_value
FROM ENUM_VALUE
WHERE id_enum = value_id) then
RETURN 'This enum value does not exist!';
end if;

DELETE
FROM ENUM_VALUE
WHERE id_value = value_id;
RETURN 'Done!';
END
$$
LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION rename_enum_value(new_val_name VARCHAR(50),
old_val_name VARCHAR(50),
enum_name VARCHAR(50))
/*функция: Функция изменения имени значения перечислений
вход:
выход: Сообщение о результате операции
эффекты:*/

returns VARCHAR(30)
AS
$$
DECLARE
ENUM_ID INTEGER;
BEGIN
SELECT * FROM get_enum_id(enum_name) INTO ENUM_ID;

IF ENUM_ID is NULL then
RETURN 'This enum does not exist!';
end if;

IF old_val_name not in (
SELECT NAME
FROM ENUM_VALUE
WHERE id_enum = ENUM_ID
) OR old_val_name IS NULL then
RETURN 'This enum value does not exist!';
end if;

IF new_val_name in (SELECT NAME
FROM ENUM_VALUE
WHERE id_enum = ENUM_ID) then
RETURN 'This name is taken!';
end if;

UPDATE ENUM_VALUE
SET NAME = new_val_name
WHERE id_enum = ENUM_ID and NAME = old_val_name;
RETURN 'Done!';
END
$$
LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION get_enum_val_number(en_name VARCHAR(50))
returns INTEGER
/*функция: Возвращает значение value для конкретного значения перечисления.
вход: en_name - название значения перечисления
выход: числовое значение value
эффекты: */
as
$$
begin
RETURN (SELECT VALUE
FROM ENUM_VALUE
WHERE ENUM_VALUE.name = en_name);
end;
$$
LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION change_number_postion(enum_val_name VARCHAR(30), new_number INTEGER, class_name VARCHAR(30))
/*функция: Изменение параметра value значения перечисления.
вход: new_number - новое значение,
enun_val_name - название значения перечисления,
class_name - название перечисления
выход: сообщение об успехе/неуспехе операции
эффекты: */
RETURNS VARCHAR(30)
AS
$$
DECLARE
ENUM_ID INTEGER;
BEGIN
SELECT * FROM get_enum_id(class_name) INTO ENUM_ID;

IF ENUM_ID IS NULL THEN
RETURN 'This enum does not exist!';
end if;

IF enum_val_name NOT IN (SELECT NAME
FROM enum_value
WHERE id_enum = ENUM_ID) THEN
RETURN 'This enum value does not exist!';
end if;

--Проверка на то, что такого значения в таблице еще нет.
IF new_number in (SELECT * FROM get_enum_numbers(class_name)) then
RETURN 'This number already exists!';
ELSE
UPDATE ENUM_VALUE
SET value = new_number
WHERE name = enum_val_name
AND ENUM_ID = enum_value.id_enum;
RETURN 'Done!';
end if;
end;
$$
LANGUAGE plpgsql;