2018/09/12 - [프로그램 자료/MySQL & MariaDB] - [MySQL & MariaDB] 문자열 분리해서 임시테이블에 넣기 split


2019/11/11 - [프로그램 자료/MySQL & MariaDB] - [MySQL & MariaDB] 커서 cursor




커서가 느리다는 말을 듣고나서 어느순간 커서를 while 문으로 변환하여 대체하고 있다.




DELIMITER $$

 

USE `dbname`$$

 

    DROP PROCEDURE IF EXISTS while_loop_example$$

   

    CREATE DEFINER='user'@'%' PROCEDURE while_loop_example

    (

        in Ids TEXT

    )

    LANGUAGE SQL

    NOT DETERMINISTIC

    CONTAINS SQL

    SQL SECURITY DEFINER

    COMMENT 'while 예제'

    BEGIN

   

 

        -- 결과용 테이블

        DROP TEMPORARY TABLE IF EXISTS tRESULT;

        CREATE TEMPORARY TABLE tRESULT

        (

            Id INT NOT NULL,

            Memo VARCHAR(128)

        ) ENGINE = MEMORY;

 

        -- 입력값 나누기

        CALL string_split(Ids, '|');

       

        -- while 문을 위해서 분리한 값에 row number를 주기위한 임시 테이블

        DROP TEMPORARY TABLE IF EXISTS tLoop;

        CREATE TEMPORARY TABLE tLoop

        (

            RN INT NOT NULL,

            Content VARCHAR(4096) NOT NULL DEFAULT ''

        ) ENGINE = MEMORY;

       

        -- row number를 포함해서 임시테이블에 입력

        INSERT INTO tLoop(RN, Content)

        SELECT (@RN := @RN + 1) AS ROWNUM, T.Content

        FROM tmpContents AS T

            CROSS JOIN (SELECT @RN := 0) AS R

        ORDER BY Content;

       

        -- while 문을 돌기위해 시작값, 종료값 변수에 대입

        SELECT MIN(RN), MAX(RN)  INTO  @i, @maxi FROM tLoop;

 

 

        while @i <= @maxi do

            -- cursor fetch 작업과 같이 분리한 테이블에서 값을 변수에 대입하고

            SELECT from_base64(Content) into @Id FROM tLoop where RN = @i;

 

            -- 결과용 테이블에 값 넣기

            INSERT INTO tRESULT(Id, Memo)

            select id, memo from ex_table

            where id = @Id;

           

            -- @i 변수에 값을 증가

            SET @i = @i + 1;

        end while;

 

        -- 결과용 테이블 반환

        select * from tRESULT;

 

       

    END$$

DELIMITER ;


Posted by motolies
,