[DB] 커서(Cursor)

Yujeong·2024년 7월 28일

데이터베이스

목록 보기
8/14
post-thumbnail

커서(Cursor)

내장 SQL을 사용할 때 발생하는 임피던스 불일치 문제를 커서를 사용하여 해결할 수 있다.

커서는 데이터베이스 쿼리 결과를 한 행씩 처리할 수 있도록 해주는 데이터베이스 객체이다. 주로 여러 행의 결과를 처리할 때 사용되며, 데이터베이스 내의 특정 위치를 가리키고, 해당 위치의 데이터를 읽거나 수정할 수 있다.

커서의 종류

  • 명시적 커서(Explicit Cursor)
    사용자가 명시적으로 선언하고 조작하는 커서
  • 암시적 커서(Implicit Cursor)
    SQL 문장이 실행될 때 자동으로 생성되는 커서

커서의 명령어

  • DECLARE: 커서 선언
DECLARE cursor_name CURSOR FOR
SELECT column1, column2
FROM table_name;
  • OPEN: 커서 열기
OPEN cursor_name;
  • FETCH: 커서에서 데이터 읽기
FETCH NEXT FROM cursor_name INTO @variable1, @variable2;
  • CLOSE: 커서 닫기
CLOSE cursor_name;
DEALLOCATE cursor_name;

커서가 필요 없는 경우

  • 단순한 작업
  • 한 번에 하나 또는 여러 행을 일괄 삽입

예시1: 단일 레코드 검색

EXEC SQL SELECT SNAME, DEPT
	INTO :VSNAME, :VDEPT
    FROM STUDENT
    WHERE SNO = :VSNO;

예시2: 갱신

EXEC SQL UPDATE ENROL
	SET SCORE = SCORE + :NEW
    WHERE CNO = 'A123';

예시3: 삽입

EXEC SQL INSERT
	INTO STUDENT(SNO, SNAME, DEPT)
    VALUES (:VSNO, :VSNAME, :VDEPT);

커서가 필요한 경우

  • 복잡한 작업
  • 여러 행을 개별적으로 처리
  • 커서를 사용하여 행 단위로 처리

예시1: 복수 레코드 검색
학과가 VDEPT의 값과 같은 학생의 레코드 모두 검색

EXEC SQL DECLARE C1 CURSOR FOR
	SELECT SNO, SNAME, YEAR
    FROM STUDENT
    WHERE DEPT = :VDEPT
EXEC SQL OPEN C1;
	DO WHILE (SQLCODE = 0);
EXEC FETCH C1 INTO :VSNO, :VSNAME, :VYEAR;
	...
EXEC SQL CLOSE C1;

예시2: 갱신
커서 C1이 가리키고 있는 레코드의 YEAR을 VYEAR의 값으로 변경

EXEC SQL UPDATE STUDENT
	SET YEAR = :VYEAR
    WHERE CURRENT OF C1;

예시3: 삭제
커서 C1이 가리키고 있는 ENROL 테이블의 레코드 삭제

EXEC SQL DELETE
	FROM ENROL
    WHERE CURRENT OF C1;

커서의 장단점

장점

  • 제어력
    데이터베이스에서 여러 행을 처리할 때 세밀하게 제어 가능
  • 다중 행 처리
    한 번에 하나의 행을 처리할 수 있어 복잡한 로직을 구현 가능

단점

  • 성능 저하
    많은 행을 처리할 때 성능 저하됨
  • 복잡성
    커서 사용 시 코드가 복잡해짐

참고
데이터베이스론

profile
공부 기록

0개의 댓글