그동안 단일 건이나 간단한 IF문만 사용하여
프로시저를 생성했는데 MySQL에서도 Oracle의 Cursor같이 여러개의 데이터를 뽑아와
데이터를 반복하여 작업을 진행해보려한다.
1. TEST 테이블 생성하기
1 2 3 4 5 6 7 8 9 | CREATE TABLE `TEST_TB1` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `useYn` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', PRIMARY KEY (`id`) ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=6; | cs |
2. 기초 데이터 넣기
1 2 3 4 5 6 7 8 9 | -- auto increment 초기화 ALTER TABLE TEST_TB1 AUTO_INCREMENT = 0; -- 데이터 삽입 INSERT INTO TEST_TB1(name, useYn) VALUES('조현영', 'Y'); INSERT INTO TEST_TB1(name, useYn) VALUES('박초아', 'Y'); INSERT INTO TEST_TB1(name, useYn) VALUES('김태연', 'Y'); INSERT INTO TEST_TB1(name, useYn) VALUES('김지숙', 'Y'); INSERT INTO TEST_TB1(name, useYn) VALUES('이상현', 'Y'); | cs |
테이블 조회 결과
3. 프로시저 만들기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | DELIMITER $$ DROP PROCEDURE IF EXISTS test_proc1; CREATE PROCEDURE test_proc1() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE v_count INT DEFAULT -1; DECLARE v_id varchar(20); DECLARE v_name varchar(20); DECLARE v_useYn varchar(20); -- select한 결과를 cursor1로 정의 DECLARE cursor1 CURSOR FOR SELECT id , name , useYn FROM TEST_TB1; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cursor1; my_loop: LOOP -- loop 하며 cursor1의 데이터를 불러와 변수에 넣는다. FETCH cursor1 INTO v_id , v_name , v_useYn; SET v_count = v_count +1 ; -- cursor1 반복이 끝나면 loop 빠져나간다. IF done THEN LEAVE my_loop; END IF; IF(v_id = 1) THEN UPDATE TEST_TB1 SET name = '전효성' WHERE id = v_id; ELSEIF (v_id = 2) THEN INSERT INTO TEST_TB1(name, useYn) VALUES('insert값', 'N'); ELSE UPDATE TEST_TB1 SET name = CONCAT(v_name, v_id) WHERE id = v_id; END IF; END LOOP; SELECT v_count; -- 커서를 닫는다. CLOSE cursor1; END $$ DELIMITER ; | cs |
cursor1에서 select한 데이터를 모두 갖고 있고
fetch를 통해 cursor의 데이터를 변수에 담고
변수에 담은 데이터를 하나씩 LOOP를 돌면서
IF문에 걸릴경우 UPDATE나 INSERT문을 만나
처리를 진행하게 된다.
LOOP를 돌릴때마다 변수의 count를 올리고 있다.
4. 프로시저 호출하기
1 | CALL test_proc1(); | cs |
프로시저를 실행하게 되면 기존 데이터가 변경되고 신규 데이터가 추가된 것을 확인 할 수 있다.
'전체 > MySQL' 카테고리의 다른 글
MySQL 프로시저 생성 (테이블 백업) 및 이벤트 스케쥴러 등록,삭제 (1) | 2019.07.30 |
---|---|
select return (0 row 0 total rows) null 결과 출력처리방법 (0) | 2019.07.19 |
MySQL function 만들기 (3) | 2019.07.17 |
MySQL 계층형 쿼리 구현하기 (13) | 2019.07.16 |
SQL EXPLAIN 정리 (0) | 2018.11.19 |