Back-end/JAVA,Spring

SQL - CURSOR 커서

cheersHena 2018. 7. 1. 22:46
반응형

CURSOR 커서


일반적으로 모니터에서 해당 위치를 알려주고 입력대기중을 알리는 깜빡이는 것을 나타냄.

같은 맥락으로 SQL에서의 커서는 메모리상에서 SQL이 실행되는 위치를 가리킨다. 


커서를 통해, 메모리에 존재하는 SQL문 실행결과를 바로 접근하여 패치(Fetch)할 수 있다. 

(메모리 영역은 SQL문 실행 및 처리 결과를 저장하는 곳.)


이때 커서는 현재 처리하고 있는 row를 가리킨다.

실행결과를 1개의 row씩 차례로 처리하며, 마지막 처리가 끝나면 커서를 닫는다.

처리할 데이터가 방대할때, 수많은 row를 처리하기 위해 명시적 커서를 선언 및 제어한다.

 



Explicit Cursor 명시적 커서 


프로그래머에 의해 직접 선언되고 이름을 지정할 수 있다.

Query결과를 첫 행부터 차례대로 처리하고, 수동으로 제어 할 수 있다.


문법)

//커서선언

DECLARE [커서이름] CURSOR FOR

[ (커서에서 쓸 데이터...)

SELECT ...

FROM ...]

// 특정조건 발생 시 프로시저 동작 제어위한 핸들러 선언.

DECLARE CONTINUE HANDLER FOR NOT FOUND

// 커서 반복 이벤트를 잡아줄 핸들러

// CONTINUE: 프로시저의 쿼리 완료 후 오류나면 명령문 실행

// NOT FOUND : 더이상 없을때 .


SET _done = TRUE;
// 앞에서 변수선언 해주어야 함. DECLARE _done INT DEFAULT FALSE;
//종료 조건을 저장할 변수 (0으로 초기화 .. )

OPEN [커서이름]; // n개의 데이터가 있는 커서를 연다.

REPEAT // n개 만큼 반복시작.

FETCH [커서이름] INTO 변수1 , 변수2...(select 해오는 컬럼 수 만큼);

//변수 1,2 는 앞에서 선언해주어야 함 (declare)

//반복할때마다 데이터를 꺼내(데리고 오다:fetch) 변수에 대입.

[ 반복할 내용 (INSERT, UPDATE, DELETE ... ) ]

UNTIL _done END REPEAT

//커서에 있는 데이터를 모두 반복 하면, 핸들러에 의해 _done값이 TRUE로 변경된다.

//_done 값이 TRUE이면 반복 종료.

CLOSE [커서이름]; // 커서 닫기.


*** 

OPEN

  • - 커서의 열기
  • - 커서안의 검색이 실행되며 아무런 데이터행을 추출하지 못해도 에러가 발생하지 않는다.
  • - 문법 : OPEN [cursor_name];

FETCH

  • - 커서의 FETCH는 현재 데이터 행을 OUTPUT변수에 반환 한다.
  • - 커서의 SELECT문의 컬럼의 수와 OUTPUT변수의 수가 동일해야 한다.
  • - 커서 컬럼의 변수의 타입과 OUTPUT변수의 데이터 타입도 동일해야 한다.
  • - 커서는 한 라인씩 데이터를 패치 한다.
  • - 문법 : FETCH [cursor_name] INTO variable1, variable2 .... ;

CLOSE

  • - 사용을 맞친 커서는 반드시 닫아 주어야 한다.
  • - 필요하다면 커서를 다시 열 수 있다.
  • - 커서를 닫은 상태에서 FETCH를 할 수 없다.
  • - 문법 : CLOSE [cursor_name];












반응형