CURSOR

  • 쿼리문에 의해서 변환되는 결과값들을 저장하는 메모리 공간
  • 커서는 테이블에서 여러 개의 행을 쿼리한 후에 쿼리의 결과인 행 집합을 한 행씩 처리하기 위한 방법이다.

커서 종류

  • 명시적(Explicit) 커서: 사용자가 선언해서 생성 후 사용하는 SQL 커서, 주로 여러개의 행을 처리하고자 할때 사용
  • 묵시적(Implicit) 커서: 오라클에서 자동으로 선언해주는 SQL 커서. 사용자는 생성 유무를 알 수 없음

커서 속성

커서를 open하고 나서 fetch가 발생하면 true를 반환

  • %FOUND - 할당할 레코드가 있는 경우 true를 반환
  • %isOpen - 커서가 오픈 상태일 경우 true 값을 반환
  • %NotFound - 할당할 레코드가 없는 경우 true를 반환
  • %RowCount - 카운터 역할을 한다. 커서가 오픈됐을 경우 0, 패치가 발생할 때 마다 1씩 증가

커서의 처리단계

img

  • 명시적 커서 선언
  • 명시적 커서 오픈
  • 커서에서 데이터 추출
  • 커서 종료
  • 커서 해제

커서의 선언

ISO 표준 문법
DECLARE cursor_name [ INSENSTIVE ] [ SCROLL ] CURSOR
    FOR select_statement
   [ FOR  { READ ONLY | UPDATE [ OF column_name [ , . . . n] ] } ]
DECLARE userTbl_cursor CURSOR GLOBAL
  FOR SELECT height FROM userTbl;

여기서 cursor가 local과 global로 나뉠수가 있다. global은 전역커서, local은 지역커서를 지정한다.

전역 커서는 모든 저장 프로시저나 일괄 처리에서 커서의 이름을 참조할 수 있다.

지역 커서는 지정된 범위(Scope)에서만 유효하며 해당 범위를 벗어나면 자동으로 소멸한다. 저장 프로시저 안에서 지역 커서를 사용 시에는 저장 프로시저가 끝나는 시점에 커서도 소멸한다. output 매개변수로 저장 프로시저의 외부로 커서를 돌려주면 그 커서를 참조하는 변수가 해제되거나 소멸할 때 커서도 같이 소멸된다.

사용 예시

DECLARE @index INT = 0, @bYear INT = 0, @age INT = 0 -- 변수 선언
SET @index = 0

DECLARE cur CURSOR FOR    
	SELECT birthYear FROM userTBL; -- 반복문을 돌릴 테이블 지정

OPEN cur; 
FETCH NEXT FROM cur INTO @bYear; -- 패치할때마다 bYear에 하나씩 넣어줌

WHILE @@FETCH_STATUS = 0 --FFTCH STATUS가 0이 될때까지 돈다
BEGIN
	SET	@age += (YEAR(GETDATE()) - @bYear) + 1 
	SET @index += 1; -- 커서가 넘어갈때마다 회원수 카운팅

	FETCH NEXT FROM cur INTO @bYear;   
END

CLOSE cur      -- 커서 닫기(자주씀)
DEALLOCATE cur   -- 커서 할당 해제(잘안씀)

PRINT '나이합은 ' + CAST(@age AS VARCHAR) -- INT형 데이터를 문자열로 형변환해서 PRINT로 출력
PRINT '회원수는 ' + CAST(@index AS VARCHAR)
PRINT '회원들의 평균 나이는 ' + CAST((@age / @index) AS VARCHAR(5))

원문

(SQL) 커서(Cursor)에 대해 알아보자 :: 청정코딩샘물 (tistory.com)

[취준생 일지 :: DB] 6. 커서(Cursor), 트리거(trigger), 전체 텍스트 검색(Full text Search Service) (tistory.com)