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 ;