Функция Postgres попробовать 3 вставки один за другим? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь создать процедуру (я крайне новичок в СУБД), в которой, учитывая данные пользователя и массив курсов, процедура попытается зарегистрировать пользователя на курсе. Если это удастся, процедура завершится с кодом 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;

Моя проблема: я новичок в процедурах и функциях, поэтому я хочу знать, является ли это правильным способом сделать это? Или есть лучший способ? Кроме того, эта функция выдает ошибку «Язык не указан». хотя я и сделал. Куда я иду не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...