본문 바로가기

IT/Oracle

CURSOR (명시적커서, 묵시적커서)

1. 커서(CURSOR)란?
 SQL Plus에서 사용자가 실행한 SQL문의 단위를 의미함. 오라클에서 수행한 모든 쿼리문은 커서 단위로 처리함.
 


2. 커서의  종류
 1) 암시적 커서: PL/SQL의 SQL문처럼 하나의 결과를 리턴하는 경우.. 커서 선언 없이도 SQL문의 실행결과가 암시적으로 커서에 저장되므로. 이를 암시적 커서라고 함.
 2) 명시적 커서: 프로그램 언어의 구조체 배열과 유사함.

* 오라클에서 커서란 시스템 글로벌 영역의 공유 풀 내에 저장공간을 사용하여 사용자가 SQL문을 실행시키면 결과 값을 저장공간에 가지고 있다가 원하는 시기에 순차적으로 FETCH 처리하여 해당 결과 셋을 프로그래밍적으로 접근할 수 있게 도와주는 기능


3. 명시적 커서
  자동적으로 생성되는 커서로, 기본적으로 PL/SQL내에서 DML문이 실행될 때마다 묵시적 커서가 생성 됨
  세션 내에 단 한개만 선언되므로, 동시에 여러개의 묵시적 커서가 사용될 수 없음

 1) 사용 밥법
 - 커서를 선언한다.
    EX) CURSOR C_FCR_MST
 - 커서를 오픈한다.
    EX) OPEN C_FCR_MST
 - 커서에 조회한 결과를 인출해 지정한다.
    EX) FETCH C_FCR_MST
 - 커서를 닫는다.
    EX) CLOSE C_FCR_MST

 

EX) CURSOR C_FCR_MST IS  
 SELECT ~~ FROM ~ ;( 세미콜론 꼭 찍어야 돼! )

BEGIN
 FOR FM_LIST IN C_FCR_MST LOOP
    돌리고 싶은 DML 넣으면 됨.
    OPEN C_FCR_MST;
     LOOP
     END LOOP;
    CLOSE C_FCR_MST;
   END LOOP;
 EXCEPTION
   WHEN OTHERS THEN
      로그같은거 저장..
 END;
 

** CURSOR C_FCR_MST(   V_CODE  IN RULE.CODE%TYPE
    V_CAATEGORY IN RULE.CATEGORY%TYPE   ) IS

  이런식으로 변수도 사용 가능.

 

2) 속성( 명시적 커서 속성은.. '명시적 커서명%속성변수' 로 붙여서 사용 됨)

  - %ROWCOUNT: FETCH문에 의해 읽혀진 데이터의 총 건수를 가지는 속성 변수
  - %FOUND: FETCH 문이 수행되었을 경우, 읽혀진(Fetch) 행이 있을 경우에는 TRUE(참) 값을 가짐
  - %NOTFOUND: FETCH 문이 수행되었을 경우, 읽혀진(Fetch) 행이 없는 경우에는 TRUE(참) 값을 가짐

 

4. 묵시적 커서
   
  1) 속성(SQL문의 실행된 결과를 커서 속성을 통해 제공하고 있는데, 주의할 점은 가장 마지막에 실행된 SQL문의 결과임)

  - %NOTFOUND: 가장 마지막에 실행된 SQL문장이 처리한 데이터 행이 없을 경우에는 TRUE(참) 값을 가짐
  - %FOUND: 가장 마지막에 실행된 SQL문장이 처리한 데이터의 행이 있을 경우 TRUE(참) 값을 가짐
  - %ROWCOUNT: 가장 마지막에 실행된 SQL 문장이 처리한 데이터 행의 총 개수를 가지는 속성변수
     EX) SQL%ROWCOUNT

** SELECT의 경우.. 묵시적커서는 한 건의 데이터를 처리하는 경우에만 정상적으로 작동하기 때문에..
    여러 행이 SELECT 될 경우에는 명시적 커서를 사용해야 합니다.