2018/09/12 - [프로그램 자료/MySQL & MariaDB] - [MySQL & MariaDB] 반복문 while loop, cursor 대체
회사 직원이랑 이야기하다보니 mariadb의 커서는 while문보다 빠르다길래 일단 형태만 정리해본다.
DELIMITER $$
USE `test`$$
DROP PROCEDURE IF EXISTS `test_proc`$$
CREATE DEFINER=`motolies`@`localhost` PROCEDURE `test_proc`(
IN iPoint INT,
OUT oResultCode CHAR(1)
)
COMMENT '테스트 프로시저'
BEGIN
/* 커서가 가지고 있는 row를 모두 소진했는지에 대한 변수 */
DECLARE mDone INT DEFAULT 0;
/* 커서에 fetch될 데이터들은 변수로 가지고 있어야 함 */
DECLARE mPoint INT DEFAULT 0;
DECLARE mTmpData INT DEFAULT 0;
/* 커서가 처음 가지고 있을 데이터 */
DECLARE cur CURSOR FOR
SELECT iPoint, 3 from dual;
/* 커서가 데이터를 찾지 못하면 mDone이라는 변수에 1을 할당함 */
DECLARE CONTINUE HANDLER FOR NOT FOUND SET mDone = 1;
/* 만약 SQL에러라면 ROLLBACK 처리한다. */
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET oResultCode = 'E';
ROLLBACK;
END;
START TRANSACTION;
/* 커서오픈 */
OPEN cur;
read_loop : LOOP
/* cursor의 데이터 fetch */
FETCH cur INTO mPoint, mTmpData;
/* 데이터가 있는지 확인 */
IF mDone THEN
LEAVE read_loop;
END IF;
SELECT mPoint, mTmpData FROM dual;
END LOOP;
CLOSE cur;
SET oResultCode = 'A';
COMMIT;
END$$
DELIMITER ;