59 lines
2.5 KiB
MySQL
59 lines
2.5 KiB
MySQL
|
|
DELIMITER $$
|
|||
|
|
|
|||
|
|
SET @saved_sql_mode = @@sql_mode
|
|||
|
|
$$
|
|||
|
|
SET @@sql_mode = 'NO_AUTO_VALUE_ON_ZERO'
|
|||
|
|
$$
|
|||
|
|
CREATE PROCEDURE `sp_add_category`(
|
|||
|
|
IN p_admin_user_id INT,
|
|||
|
|
IN p_actor_description VARCHAR(100),
|
|||
|
|
IN p_category_name VARCHAR(40),
|
|||
|
|
OUT p_new_category_id TINYINT UNSIGNED,
|
|||
|
|
OUT p_result_message VARCHAR(255)
|
|||
|
|
)
|
|||
|
|
COMMENT '카테고리 추가 및 로그 기록 (ID 자동 할당)'
|
|||
|
|
BEGIN
|
|||
|
|
DECLARE v_existing_cat_id TINYINT UNSIGNED DEFAULT NULL;
|
|||
|
|
DECLARE v_next_id TINYINT UNSIGNED;
|
|||
|
|
DECLARE v_max_id TINYINT UNSIGNED;
|
|||
|
|
DECLARE v_now DATETIME DEFAULT NOW();
|
|||
|
|
|
|||
|
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
|||
|
|
BEGIN
|
|||
|
|
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
|
|||
|
|
ROLLBACK; SET p_new_category_id = NULL; SET p_result_message = CONCAT('DB 오류 (', @errno, '): ', @text);
|
|||
|
|
END;
|
|||
|
|
|
|||
|
|
-- 입력값 검증
|
|||
|
|
IF p_admin_user_id IS NULL AND p_actor_description IS NULL THEN
|
|||
|
|
SET p_new_category_id = NULL; SET p_result_message = '작업 주체 정보는 필수입니다.';
|
|||
|
|
ELSEIF p_category_name IS NULL OR p_category_name = '' THEN
|
|||
|
|
SET p_new_category_id = NULL; SET p_result_message = '카테고리 이름은 필수입니다.';
|
|||
|
|
ELSE
|
|||
|
|
-- 카테고리 이름 중복 검사
|
|||
|
|
SELECT category_id INTO v_existing_cat_id FROM resource_category WHERE LOWER(category_name) = LOWER(p_category_name) LIMIT 1;
|
|||
|
|
IF v_existing_cat_id IS NOT NULL THEN
|
|||
|
|
SET p_new_category_id = NULL; SET p_result_message = CONCAT('이미 사용 중인 카테고리 이름입니다: ', p_category_name);
|
|||
|
|
ELSE
|
|||
|
|
-- 다음 ID 할당
|
|||
|
|
SELECT IFNULL(MAX(category_id), 0) INTO v_max_id FROM resource_category;
|
|||
|
|
SET v_next_id = v_max_id + 1;
|
|||
|
|
IF v_next_id > 255 THEN
|
|||
|
|
SET p_new_category_id = NULL; SET p_result_message = '더 이상 카테고리 ID를 할당할 수 없습니다 (최대 255).';
|
|||
|
|
ELSE
|
|||
|
|
-- 모든 검증 통과, 트랜잭션 시작
|
|||
|
|
START TRANSACTION;
|
|||
|
|
INSERT INTO resource_category (category_id, category_name) VALUES (v_next_id, p_category_name);
|
|||
|
|
SET p_new_category_id = v_next_id;
|
|||
|
|
INSERT INTO log_add_category (log_date, admin_user_id, actor_description, category_id, category_name)
|
|||
|
|
VALUES (v_now, p_admin_user_id, p_actor_description, p_new_category_id, p_category_name);
|
|||
|
|
COMMIT;
|
|||
|
|
SET p_result_message = CONCAT('카테고리 "', p_category_name, '" (ID: ', p_new_category_id, ') 추가 완료.');
|
|||
|
|
END IF; -- ID 범위 IF 종료
|
|||
|
|
END IF; -- 이름 중복 IF 종료
|
|||
|
|
END IF; -- 입력값 검증 IF 종료
|
|||
|
|
|
|||
|
|
END
|
|||
|
|
$$
|
|||
|
|
|
|||
|
|
DELIMITER ;
|