Files
gyber/db/procedures/sp_update_category_name.sql
2025-09-15 13:33:34 +09:00

56 lines
2.5 KiB
SQL

DELIMITER $$
SET @saved_sql_mode = @@sql_mode
$$
SET @@sql_mode = 'NO_AUTO_VALUE_ON_ZERO'
$$
CREATE PROCEDURE `sp_update_category_name`(
IN p_admin_user_id INT,
IN p_actor_description VARCHAR(100),
IN p_category_id TINYINT UNSIGNED,
IN p_new_category_name VARCHAR(40),
OUT p_result_message VARCHAR(255)
)
COMMENT '카테고리 이름 수정 및 로그 기록'
BEGIN
DECLARE v_old_category_name VARCHAR(40);
DECLARE v_existing_cat_id TINYINT UNSIGNED DEFAULT NULL;
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_result_message = CONCAT('DB 오류 (', @errno, '): ', @text);
END;
-- 입력값 검증
IF p_admin_user_id IS NULL AND p_actor_description IS NULL THEN
SET p_result_message = '작업 주체 정보는 필수입니다.';
ELSEIF p_new_category_name IS NULL OR p_new_category_name = '' THEN
SET p_result_message = '카테고리 이름은 필수입니다.';
ELSE
-- 기존 정보 조회 및 존재 확인
SELECT category_name INTO v_old_category_name FROM resource_category WHERE category_id = p_category_id;
IF v_old_category_name IS NULL THEN
SET p_result_message = CONCAT('수정할 카테고리를 찾을 수 없습니다 (ID: ', p_category_id, ')');
ELSE
-- 카테고리 이름 중복 검사 (자기 자신 제외)
SELECT category_id INTO v_existing_cat_id FROM resource_category WHERE LOWER(category_name) = LOWER(p_new_category_name) AND category_id != p_category_id LIMIT 1;
IF v_existing_cat_id IS NOT NULL THEN
SET p_result_message = CONCAT('이미 사용 중인 카테고리 이름입니다: ', p_new_category_name);
ELSE
-- 모든 검증 통과, 트랜잭션 시작
START TRANSACTION;
UPDATE resource_category SET category_name = p_new_category_name WHERE category_id = p_category_id;
INSERT INTO log_update_category (log_date, admin_user_id, actor_description, category_id, old_category_name, new_category_name)
VALUES (v_now, p_admin_user_id, p_actor_description, p_category_id, v_old_category_name, p_new_category_name);
COMMIT;
SET p_result_message = CONCAT('카테고리 (ID: ', p_category_id, ') 이름 수정 완료.');
END IF; -- 이름 중복 IF 종료
END IF; -- 카테고리 존재 IF 종료
END IF; -- 입력값 검증 IF 종료
END
$$
DELIMITER ;