[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
'Database(DB) > mysql' 카테고리의 다른 글
[error] [ERROR] Plugin 'InnoDB' init function returned error. (0) | 2018.10.01 |
---|---|
[mysql] 프로시저 예제_2 입력받은 매개변수에 따라 변화하는 값 테이블에 입력하는 프로시저 (0) | 2018.09.15 |
[mysql] 프로시저 예제1 매개변수를 이용한 동적쿼리 생성 프로시저 (0) | 2018.09.12 |
[mysql] 특정 구분자로 합쳐진 데이터 분리하기 (0) | 2018.09.11 |
[mysql] error Table './mysql/user' is marked as crashed and should be repaired (0) | 2018.09.10 |