본문 바로가기
Database/MYSQL

커서(Cursors)

by 반화넬 2007. 6. 4.
반응형
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
반응형