본문 바로가기
Database/MySQL

[MySQL] 커서

by oncerun 2020. 7. 1.
반응형

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

 

JSP를 통한 웹 개발을 해봤다면 사용자의 객체를 생성할 때 ResultSet 객체를 사용해 보았을 것이다.

rs.next() 메서드는 커서를 이용하여 데이터가 존재한다면 그행을 읽어 데이터를 가져오는 역할을 한다.

 

커서는 테이블에서 여러 개의 행을 쿼리한 후에, 쿼리의 결과인 행 집합을 한 행씩 처리하기 위한 방식이다.

한 행씩 읽을 때마다 커서 포인터는 자동으로 다음 줄을 가리키게 됩니다.

 

 

 

커서의 처리 순서

 

커서를 활용해 게시판의 조회수의 평균을 구하는 프로시저를 작성합니다.

 


DROP PROCEDURE IF EXISTS cursorProc;
DELIMITER $$
CREATE PROCEDURE cursorProc()
BEGIN
	DECLARE noticeHit INT DEFAULT 0; --조회수
    DECLARE noticeCnt INT DEFAULT 0; -- 게시글 수
    DECLARE totalHit INT DEFAULT 0; -- 합계
    
    DECLARE endOfRow BOOLEAN DEFAULT FALSE; --행의 끝여부
    
	DECLARE noticeCursor CURSOR FOR   --  커서선언
		SELECT hit from Notice;
        
	DECLARE CONTINUE HANDLER
		FOR NOT FOUND SET endOfRow = TRUE  --행의 끝일때 변수에 TRUE값 대입
        
        OPEN noticeCursor; --커서 오픈
        
        cursor_loop: LOOP
        FETCH noticeCursor INTO noticeHit; --hit 1개를 변수에 대입
        
        IF endOfRow THEN 
			LEAVE cursor_loop;  --읽을 행 없을때 종료
        END IF;
        
        SET noticeCnt = noticeCnt + 1;
        SET totalHit = totalHit + noticeHit;
        
        END LOOP cursor_loop;  --루프종료
 SELECT totalHit;
 SELECT noticeHit;
 SELECT noticeCnt;
 SELECT CONCAT('게시판의 조회수 평균',(totalHit/noticeCnt));
 
 CLOSE noticeCursor;
 END $$
 DELIMITER ;
        
        
CALL cursorProc();

 

반응형

'Database > MySQL' 카테고리의 다른 글

[MySQL] 트리거  (0) 2020.07.01
[MySQL] Stored Program  (0) 2020.07.01
MySQL DATE / TIME TYPE  (0) 2020.05.09
MySQL String Type  (0) 2020.05.09
MySQL Numeric Type  (0) 2020.05.08

댓글