-- DB 생성
-- CREATE DATABASE my_practice_db;
USE my_practice_db;
SHOW DATABASES;
-- 테이블 설계
CREATE TABLE users(
id INT PRIMARY KEY,
name VARCHAR(50),
point INT DEFAULT 0,
level INT
);
CREATE TABLE point_log(
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
message VARCHAR(100),
log_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
SHOW TABLES;
-- 1. 샘플 데이터 삽입
INSERT INTO users (id, name, point, level)
VALUES (1, 'Peter', 100, 5),
(2, 'Finn', 150, 3),
(3, 'Jake', 200, 7);
SELECT * FROM users;

-- 2. 조건 분기로 포인트를 지급하는 프로시저 생성
DROP PROCEDURE IF EXISTS GivePoint;
CREATE PROCEDURE GivePoint (
IN p_id INT
)
BEGIN
DECLARE v_level INT;
DECLARE v_msg VARCHAR(100);
SELECT level INTO v_level
FROM users
WHERE id = p_id;
IF v_level >= 5 THEN
UPDATE users SET point = point + 50
WHERE id = p_id;
SET v_msg = '50 포인트가 지급되었습니다.';
ELSE
SET v_msg = '레벨이 낮아 포인트 지급 대상이 아닙니다.';
END IF;
INSERT INTO point_log (user_id, message) VALUES (p_id, v_msg);
END;
SHOW PROCEDURE STATUS WHERE Db = 'my_practice_db';
-- 3. GivePoint 프로시저 테스트
CALL GivePoint(1);
SELECT * FROM point_log;

-- 4. GivePoint를 모든 레코드에 대해 반복 실행하는 프로시저 생성
DROP PROCEDURE IF EXISTS GivePointToAll;
CREATE PROCEDURE GivePointToAll ()
BEGIN
DECLARE v_id INT;
DECLARE done INT DEFAULT FALSE;
DECLARE user_cursor CURSOR FOR
SELECT id FROM users ORDER BY id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN user_cursor;
read_user: LOOP
FETCH user_cursor INTO v_id;
IF done THEN
LEAVE read_user;
END IF;
CALL GivePoint(v_id);
END LOOP;
CLOSE user_cursor;
END;
SHOW PROCEDURE STATUS WHERE Db = 'my_practice_db';
-- 5. GivePointToAll 프로시저 테스트
CALL GivePointToAll();
SELECT * FROM point_log;

전반적으로 뜬구름 잡는 듯한 개념을 직접 작성하며 익혀봤다.
확실히 직접 하면 더 잘 와닿는다.
하지만 아직도 보고 작성한 부분도 많고 작성하면서 틀린 부분도 많았어서 멀었구나 싶다.
SQL.. 조회만 할 줄 알았지 정말 아무것도 몰랐구나 싶기도 하고.
공부를 하다보니 또 재밌다.