본문으로 바로가기

mysql 커서 샘플 - Cursor

category [ 서버 & DB 관련 ]/MySQL 2019. 4. 29. 14:37

-- 같은 이름의 프로시저 있으면 삭제
DROP PROCEDURE IF EXISTS cursor_test;
DELIMITER $$

CREATE PROCEDURE cursor_test(
    IN val VARCHAR(30) /*파라미터 선언*/
)
BEGIN

    /*
    * 커서 테스트 1
    * CALL cursor_test(3);
    */

    -- 반복문 변수선언
    DECLARE done int DEFAULT 0;

    -- 커서에서 사용할 변수선언
    DECLARE vval1, vval2 varchar(30);
    DECLARE u_cnt int;

    -- 커서에서 사용할 Select 테이블 선언
    DEClARE openCursor CURSOR FOR SELECT val1, val2 FROM test1 WHERE val3 <> '' ;

    -- 반복문 핸들러 선언
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;

    -- 임시 테이블 생성
    DROP TEMPORARY TABLE IF EXISTS TB_Tmp;
    CREATE TEMPORARY TABLE TB_Tmp
    (
        uid1 varchar(30)
        ,uid2 varchar(30)
        ,cnt int
    );

    SET u_cnt = 1;

    -- 커서오픈
    OPEN openCursor;

    -- 반복문 시작
    read_loop: LOOP

        -- 커서에서 데이터 가져옴
        FETCH openCursor INTO vval1, vval2;

        -- 반복문 종료 조건
        IF done THEN
            LEAVE read_loop;
        END IF;

        INSERT INTO TB_Tmp VALUES(vval1, vval2, u_cnt);
        SET u_cnt = u_cnt + 1;

    -- 반복문 끝
    END LOOP read_loop;

    -- 커서해제
    CLOSE openCursor;

    -- 임시 테이블 출력
    SELECT * FROM TB_Tmp ORDER BY cnt DESC;

END$$
DELIMITER ;


-- 프로시저실행
CALL cursor_test(3);





===================================




-- 같은 이름의 프로시저 있으면 삭제
DROP PROCEDURE IF EXISTS cursor_test2;
DELIMITER $$

CREATE PROCEDURE cursor_test2(
    IN val VARCHAR(30) /*파라미터 선언*/
)
BEGIN

    /*
    * 커서 테스트 2
    * CALL cursor_test2(3);
    */

    -- 반복문 변수선언
    DECLARE done INTEGER DEFAULT 0;

    -- 커서에서 사용할 변수선언
    DECLARE vval1, vval2 varchar(30);
    DECLARE u_cnt int;

    -- 커서에서 사용할 Select 테이블 선언
    DEClARE openCursor CURSOR FOR SELECT val1, val2 FROM test1 WHERE val3 <> '' ;

    -- 반복문 핸들러 선언
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;

    -- 임시 테이블 생성
    DROP TEMPORARY TABLE IF EXISTS TB_Tmp;
    CREATE TEMPORARY TABLE TB_Tmp
    (
        uid1 varchar(30)
        ,uid2 varchar(30)
        ,cnt int
    );

    SET u_cnt = 1;

    -- 커서오픈
    OPEN openCursor;

    REPEAT
        FETCH NEXT FROM openCursor INTO vval1, vval2;

        -- 반복문 종료 조건
        IF NOT done THEN
            INSERT INTO TB_Tmp VALUES(vval1, vval2, u_cnt);
            SET u_cnt = u_cnt + 2;
        END IF;

    UNTIL done END REPEAT;

    -- 커서해제
    CLOSE openCursor;

    -- 임시 테이블 출력
    SELECT * FROM TB_Tmp ORDER BY cnt DESC;
    DROP TEMPORARY TABLE TB_Tmp;

END$$
DELIMITER ;


-- 프로시저실행
CALL cursor_test2(3);

'[ 서버 & DB 관련 ] > MySQL' 카테고리의 다른 글

mysql FUNCTION, PROCEDURE 예제  (0) 2019.05.10
변수 사용 예  (0) 2019.05.02
group_concat() 한줄로 보이도록 -  (0) 2019.04.25
mysql dblink  (0) 2019.04.22
Mysql Join에 대한 설명  (0) 2019.01.21