IT_DBMS/MySQL & Maria DB

[MySQL] 저장 프로시저(Stored Procedure), 커서(Cursor) 사용 예제

JJun ™ 2011. 1. 16. 01:42

 출처 : MySQL 5.0 Reference Manual



CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN cur1;
OPEN cur2;

read_loop: LOOP
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF done THEN
LEAVE read_loop;
END IF;
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END LOOP;

CLOSE cur1;
CLOSE cur2;
END;

CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`.`usp_cursor_example`(
IN name_in VARCHAR(255)
)
READS SQL DATA
BEGIN

/*
All 'DECLARE' statements must come first
*/

-- Declare '_val' variables to read in each record from the cursor
DECLARE name_val VARCHAR(255);
DECLARE status_update_val VARCHAR(255);

-- Declare variables used just for cursor and loop control
DECLARE no_more_rows BOOLEAN;
DECLARE loop_cntr INT DEFAULT 0;
DECLARE num_rows INT DEFAULT 0;

-- Declare the cursor
DECLARE friends_cur CURSOR FOR
SELECT
name
, status_update
FROM foo.friend_status
WHERE name = name_in;

-- Declare 'handlers' for exceptions
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_rows = TRUE;

/*
Now the programming logic
*/

-- 'open' the cursor and capture the number of rows returned
-- (the 'select' gets invoked when the cursor is 'opened')
OPEN friends_cur;
select FOUND_ROWS() into num_rows;

the_loop: LOOP

FETCH friends_cur
INTO name_val
, status_update_val;

-- break out of the loop if
-- 1) there were no records, or
-- 2) we've processed them all
IF no_more_rows THEN
CLOSE friends_cur;
LEAVE the_loop;
END IF;

-- the equivalent of a 'print statement' in a stored procedure
-- it simply displays output for each loop
select name_val, status_update_val;

-- count the number of times looped
SET loop_cntr = loop_cntr + 1;

END LOOP the_loop;

-- 'print' the output so we can see they are the same
select num_rows, loop_cntr;

END
DELIMITER ;