반응형
17.2.9. 커서(Cursors)
17.2.9.1. Cursors 선언하기
DECLARE cursor_name CURSOR FOR select_statement
이 명령문은 커서를 선언하는 것이다. 다중 커서는 루틴 내에서 선언될 수도 있으나, 주어진 블록내의 각 커서는 반드시 서로 다른 이름을 가져야 한다 . SELECT 명령문은 INTO 구문을 가질 수 없다.
17.2.9.2. Cursor OPEN 명령문
OPEN cursor_name
이 명령문은 이전에 선언한 커서를 연다.
17.2.9.3. Cursor FETCH 명령문
FETCH cursor_name INTO var_name [, var_name] ...
이 명령문은 지정한 오픈 커서를 이용해서 바로 다음 열(만일 열이 존재한다면)을 가져온 다음, 커서 포인터를 전진 시킨다.
17.2.9.4. Cursor CLOSE 명령문
CLOSE cursor_name
이 명령문은 이전에 열어 놓은 커서를 닫는다.
만일 확실하게 닫혀지지 않으면, 커서는 커서가 선언된 복합 명령문의 마지막에서 닫히게 된다.
단순한 커서는 스토어드 프로시저 및 함수 내부에서 지원된다. 신텍스는 임베디드 SQL와 같다. 커서는 현재까지 어센서티브(asensitive)하며, 읽기 전용, 및 논-스크롤링(non-scrolling)하다. 어센서티브란 서버가 자신의 결과 테이블의 복사본을 만들 수 있거나 또는 만들지 못할 수도 있음을 의미하는 것이다. 커서는 핸들러를 선언하기 전에 선언되어야 하며, 변수와 컨디션은 커서 또는 핸들러를 선언하기 전에 선언되어야 한다.
예제:
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 SQLSTATE '02000' SET done = 1;
OPEN cur1;
OPEN cur2;
REPEAT
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
CLOSE cur2;
END
17.2.9.1. Cursors 선언하기
DECLARE cursor_name CURSOR FOR select_statement
이 명령문은 커서를 선언하는 것이다. 다중 커서는 루틴 내에서 선언될 수도 있으나, 주어진 블록내의 각 커서는 반드시 서로 다른 이름을 가져야 한다 . SELECT 명령문은 INTO 구문을 가질 수 없다.
17.2.9.2. Cursor OPEN 명령문
OPEN cursor_name
이 명령문은 이전에 선언한 커서를 연다.
17.2.9.3. Cursor FETCH 명령문
FETCH cursor_name INTO var_name [, var_name] ...
이 명령문은 지정한 오픈 커서를 이용해서 바로 다음 열(만일 열이 존재한다면)을 가져온 다음, 커서 포인터를 전진 시킨다.
17.2.9.4. Cursor CLOSE 명령문
CLOSE cursor_name
이 명령문은 이전에 열어 놓은 커서를 닫는다.
만일 확실하게 닫혀지지 않으면, 커서는 커서가 선언된 복합 명령문의 마지막에서 닫히게 된다.
단순한 커서는 스토어드 프로시저 및 함수 내부에서 지원된다. 신텍스는 임베디드 SQL와 같다. 커서는 현재까지 어센서티브(asensitive)하며, 읽기 전용, 및 논-스크롤링(non-scrolling)하다. 어센서티브란 서버가 자신의 결과 테이블의 복사본을 만들 수 있거나 또는 만들지 못할 수도 있음을 의미하는 것이다. 커서는 핸들러를 선언하기 전에 선언되어야 하며, 변수와 컨디션은 커서 또는 핸들러를 선언하기 전에 선언되어야 한다.
예제:
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 SQLSTATE '02000' SET done = 1;
OPEN cur1;
OPEN cur2;
REPEAT
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
CLOSE cur2;
END
반응형