Я пытаюсь создать процедуру (я крайне новичок в СУБД), в которой, учитывая данные пользователя и массив курсов, процедура попытается зарегистрировать пользователя на курсе. Если это удастся, процедура завершится с кодом 1, иначе она попытается снова для второго курса в массиве, и так до третьего.
Вот что я придумал:
CREATE OR REPLACE FUNCTION enroll_user_procedure(userID INTEGER, REFID INTEGER[], REFTYPE CHARACTER VARYING, slotNO SMALLINT)
RETURNS code AS $$
BEGIN
INSERT INTO user_enrollments(user_id,ref_id,type,slot) VALUES (userID,REFID[1],REFTYPE,slotNO) RETURNING enroll_id INTO enroll_id;
EXCEPTION
WHEN SQLSTATE 'COUFL' then
INSERT INTO user_enrollments(user_id,ref_id,type,slot) VALUES (userID,REFID[2],REFTYPE,slotNO) RETURNING enroll_id INTO enroll_id;
EXCEPTION
WHEN SQLSTATE 'COUFL' then
INSERT INTO user_enrollments(user_id,ref_id,type,slot) VALUES (userID,REFID[3],REFTYPE,slotNO) RETURNING enroll_id INTO enroll_id;
EXCEPTION
WHEN SQLSTATE 'COUFL' then
RETURN QUERY SELECT 0 INTO code;
END
END;
END;
COMMIT;
END;
$$; LANGUAGE plpgsql
Где COUFL повышается этой триггерной функцией:
if enroll_count >= courses_limit then
UPDATE courses SET status = 0 WHERE course_id = NEW.ref_id;
RAISE EXCEPTION USING
errcode='COUFL',
message='course_full';
end if;
Моя проблема: я новичок в процедурах и функциях, поэтому я хочу знать, является ли это правильным способом сделать это? Или есть лучший способ? Кроме того, эта функция выдает ошибку «Язык не указан». хотя я и сделал. Куда я иду не так?