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 ;




Posted by motolies
,