CURSOR

DONI·2022년 3월 29일
0

Oracle

목록 보기
21/22
post-thumbnail

🏹 커서 (CURSOR)

SELECT문 처리 결과(RESULT SET)를 담고 있는 메모리 공간에 대한 포인터(참조)
커서 사용 시 복수행의 처리 결과에 한 행씩 순차적으로 접근 가능

  🔎 RESULT SET이 단일행일 경우 INTO절을 이용해 변수에 결과를 저장할 수 있지만,
       복수행일 경우에는 INTO절을 이용하여 처리할 수 없다.
       이때, 복수행의 결과를 CURSOR를 이용해 행 단위로 처리할 수 있다.


🏹 묵시적 커서 (IMPLICIT CURSOR)

오라클에서 PL/SQL 블록의 SQL문이 실행될 때마다 자동으로 생성되어 사용되는 커서
사용자는 생성 유무를 알 수 없지만, 커서의 속성을 이용하여 커서의 정보를 얻어올 수 있음
(묵시적 커서의 정보 참조 시 커서명 : SQL)

  • 커서의 속성
    • %ROWCOUNT : SQL문 처리 결과로 얻어온 ROW 수 (0부터 시작, FETCH마다 1 증가)
    • %FOUND : 커서 영역의 ROW 수가 1개 이상이면 TRUE, 1개 미만이면 FALSE
    • %NOTFOUND : 커서 영역의 ROW 수가 1개 미만이면 TRUE, 1개 이상이면 FALSE
    • %ISOPEN : 커서가 OPEN 상태이면 TRUE (묵시적 커서는 항상 FALSE)

🏹 명시적 커서 (EXPLICIT CURSOR)

사용자가 직접 선언하여 사용할 수 있는 커서

  • 커서 사용 4단계
    1) CURSOR : 커서 선언
    2) OPEN : 커서 열기
    3) FETCH -- 데이터 추출
    4) CLOSE -- 커서 닫기

🚩 소스코드 - 명시적 커서

   ▪ 나이가 20살 이상인 학생의 학번, 이름, 나이를 출력

DECLARE -- 선언부
    -- 커서 선언
    CURSOR C_TEST IS 
        SELECT ST_ID, ST_NAME, ST_AGE FROM STUDENT 
        WHERE AGE >= 20;
        
    -- 변수 선언
    ID STUDENT.ST_ID%TYPE;
    NAME STUDENT.ST_NAME%TYPE;
    AGE STUDENT.ST_AGE%TYPE;
    
BEGIN -- 실행부
    OPEN C_TEST; -- 커서 열기
    
    -- 반복문 활용
    -- 주의 : 무한 반복에 대한 종료 조건 필요!
    LOOP
        FETCH C_TEST INTO ID, NAME, AGE; -- 데이터 추출 후 변수에 결과 값 저장
        EXIT WHEN C_TEST%NOTFOUND; -- 종료 조건
        DBMS_OUTPUT.PUT_LINE(ID || ' / ' || NAME || ' / ' || AGE);
    END LOOP;
    CLOSE C_TEST; -- 커서 닫기
END;
/

🚩 소스코드 - FOR문을 이용한 명시적 커서

🔎 FOR문을 이용한 커서에서는 OPEN, FETCH, CLOSE가 자동으로 이루어진다!

DECLARE
    CURSOR C_TEST IS 
        SELECT ST_ID, ST_NAME, ST_AGE FROM STUDENT 
        WHERE AGE >= 20;
    STU STUDENT%ROWTYPE;
BEGIN
    FOR STU IN C_TEST 
    LOOP
        DBMS_OUTPUT.PUT_LINE(
        STU.ST_ID || ' / ' || STU.ST_NAME || ' / ' || STU.ST_AGE);
    END LOOP;
END;
/
profile
틀린 내용이 있다면 댓글 또는 이메일로 알려주세요 ❤ꔛ❜

0개의 댓글