База данных: Oracle 18 c
Информация о данных:
У нас есть временное понятие сезонов, и у нас есть набор бизнес-групп в каждый сезон. В моей таблице AGROUP есть столбцы (идентификатор * [автоматически сгенерирован], NAME, SEASON_ID). Имена групп должны быть уникальными в зависимости от сезона. Иными словами, я могу иметь две группы с одинаковым именем ТОЛЬКО , если они находятся в разные времена года.
Задача под рукой:
Мне нужно создать хранимую процедуру, которая с учетом исходного сезона и целевого сезона , можно скопировать все группы из исходного сезона в целевой сезон. Эта часть достаточно проста. Наивное решение:
PROCEDURE COPY_GROUPS(IN_SOURCE_SEASON_ID IN SEASON.ID%TYPE,
IN_TARGET_SEASON_ID IN SEASON.ID%TYPE)
AS
WITH SOURCE AS
(SELECT AG.ID AS AG_ID,
AG.NAME,
AG.SEASON_ID
FROM AGROUP AG
WHERE AG.SEASON_ID = IN_SOURCE_SEASON_ID)
INSERT INTO AGROUP (NAME, SEASON_ID)
SELECT SRC.NAME,
IN_TARGET_SEASON_ID AS SEASON_ID,
FROM SOURCE SRC;
COMMIT;
END;
Хитрость заключается в том, что существует вероятность того, что в целевом сезоне существует группа, которая уже имеет то же имя, что и группа в исходном сезоне. Без вмешательства это приведет к уникальной ошибке ограничения. В этом случае мы хотим скопировать группу, но переименовать ее в нечто уникальное. Любой способ переименования - это хорошо, но моя первая мысль - просто переименовать с суффиксным номером. Чтобы сделать это, я полагаю, что я бы изменил все вокруг, чтобы открыть через REFCURSOR
и l oop, вставляя по одному и перехватывая уникальную ошибку ограничения и отвечая повторной попыткой вставить с суффиксом числа. Я действительно опыт работы с обработкой ошибок маршрутизации, как это в Oracle однако. Я действительно мог бы использовать некоторые указания в правильном направлении.
Спасибо за помощь!