[COMMENT]

아직 프로시저에서 커서의 사용이 어떤 작업때 사용해야하는지 실무적으로 감이 없다.

대략적으로 이해한 것을 적어보면 select into 를 이용할 경우는 하나의 데이터만 변수값으로 가질 수 있으므로

select 한 결과를 한 로우씩 받아서 처리해야할 때 커서를 이용한다. 



프로시저 예제. 커서(CURSOR) 이용하기

1. 프로시저 생성 


DELIMITER //


DROP PROCEDURE IF EXISTS EVT_MONITORING;

CREATE PROCEDURE EVT_MONITORING()


BEGIN


DECLARE v_finished INTEGER DEFAULT 0;

DECLARE v_evtname varchar(20);                # select 한 컬럼을 담을 변수 선언

DECLARE v_evtlist varchar(255) DEFAULT "";  # 읽어온 로우를 하나로 연결하여 담을 변수 선언

DECLARE evtlist_cursor CURSOR FOR        # 커서 선언 (커서이름은 마음대로 생성 가능 ex. evtlist_cursor )

SELECT NAME FROM user;                     # 커서를 사용할 테으블 명시

DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

OPEN evtlist_cursor;        # 커사를 사용하기 위한 오픈 명시

get_ename : LOOP

FETCH evtlist_cursor INTO v_evtname;    #  select에서 얻은 결과값을 v_evtname 변수에 넣는다 (여러개의 경우 , 로 구분)

IF v_finished = 1 THEN        # row 가 끝까지 갔을 경우 loop 빠져 나가기

LEAVE get_ename; 

END IF;

SET v_evtlist = CONCAT(v_evtname,",",v_evtlist);

END LOOP get_ename;

CLOSE evtlist_cursor;

#select v_evtlist;

  select RIGHT(v_evtlist,(CHAR_LENGTH(v_evtlist)-1));  #마지막 , 제외하기 위해서..


END //


DELIMITER ;



2. 프로시저 호출 및 결과 


CALL EVT_MONITORING();





row를 다 불러오고 나서 ,값을 없앨 수 있는 방법을 고민해봐야겠다 ㅠ

-> RIGHT, CHAR_LENGTH 함수를 사용하여 처리하였는데, 이런 처리 없이 바로 가능한 방법이 없을지 좀 더 고민해봐야지 ㅠ


참고 및 출처

커서사용 간단 예제 : http://coolmsd.tistory.com/31

[Stored Procedure] 10. MySQL Cursor : http://blog.duveen.me/20?category=657591


+ Recent posts