[mysql] 커서(CORSUR) 간단 예제

2021. 4. 6. 01:40 Database/mysql procedure, function

[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