我正在尝试创建一个过程(对于RDBMS来说是非常陌生的),其中给出了用户的详细信息和一系列课程,该过程将尝试使用户注册该课程。如果成功,该过程将以代码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;
我的问题:我是过程和函数的新手,所以我想知道这是否是正确的方法?或者,还有更好的方法?此外,此功能还会显示“未指定语言”错误。即使我做到了我要去哪里错了?