DB/MySQL

[MySQL] Cursor

야곰야곰+책벌레 2021. 4. 20. 17:14
728x90
반응형

MySQL은 Stored Procedure의 내부에 Cursor를 사용할 수 있다. Cursor는 일반 프로그래밍 언어의 파일 처리와 방법이 비슷하기 때문에 행의 집합을 다루기에 편리한 기능을 많이 제공해 준다.

 

1. Cursor의 처리 순서

Curosr는 일반적으로 아래와 같은 순서를 통해서 처리된다.

Cursor의 작동 순서

Cursor를 하나씩 이해하기보다는 우선 간단한 예제로 Cursor의 동작을 이해하는 것이 빠르다.

DELIMITER $$
CREATE PROCEDURE SP_check_integrity_submach()
BEGIN
	DECLARE endOfRow BOOLEAN DEFAULT FALSE; -- 행의 끝 여부 (Default : FALSE)
    
	-- CURSOR에 사용할 변수
	DECLARE sqlmachID VARCHAR(2); -- machID 를 저장할 변수

	-- CHECK SUBMACHINE TABLE INTEGRITY
	DECLARE idCursor CURSOR FOR -- CURSOR 선언
		SELECT DISTINCT machID FROM submachtbl;
        
	-- 반복 핸들러 선언
	DECLARE CONTINUE HANDLER -- 행의 끝이면 endOfRow 변수에 TRUE 대입
		FOR NOT FOUND SET endOfRow = TRUE;
        
    -- 커버 열기
	OPEN idCursor;
    -- LOOP 구문
	integrity_loop : LOOP
		FETCH idCursor INTO sqlmachID; -- 첫번째 데이터 가져오기
		IF endOfRow THEN
			LEAVE integrity_loop; -- 마지막 행이면 탈출!!
		END IF;
		
        -- 데이터 처리
		IF NOT EXISTS (SELECT machID FROM machtbl WHERE machID = sqlmachID)
			THEN DELETE FROM submachtbl WHERE machID = sqlmachID;
		END IF;
                        
	END LOOP integrity_loop;
    -- 커서 닫기
    CLOSE idCursor;
    
END$$
DELIMITER ;

CURSOR를 OPEN하고 LOOP 문을 이용하여 연속적인 데이터 처리가 가능하다. FETCH는 DECLARE 된 CURSOR의 데이터를 한 행씩 받아올 수 있다. 전달받은 데이터로 원하는 작업을 하면 개별 행에 대한 여러 가지 처리를 편하게 처리가 가능하다.

 

DELIMITER $$ 
  문장을 구분하는 구분자가 세미콜론(;)인데 프로시저 정의 부분에 세미콜론(;)을 사용해야 하기 때문에 프로시저를 구분하는 구분자를 임시로 $$로 바꿔 준다는 이걸 잠시 $$로 바꿔줘서 중간에 정의되는 세미콜론(;)을 인식하지 않게 하기 위함이다. 그래서 마지막에 DELIMITER ; 를 해서 구분자를 세미콜론(;)으로 되돌려주어야 한다. 
프로시저를 만드는 이유는 MySQL 에디터에서는 프로시저 없이 LOOP를 실행하는 것이 불가능하기 때문이다.
728x90
반응형