Скачиваний:
4
Добавлен:
31.05.2023
Размер:
7 Кб
Скачать
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;