Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

꺄르륵

[Oracle SQL Developer] 기초 XXV - CURSOR 본문

프로그래밍/DB

[Oracle SQL Developer] 기초 XXV - CURSOR

Teddy. 2019. 10. 29. 20:02

1. 커서(CURSOR)


  1.1. 설명
  
    - 쿼리의 수행으로 영향을 받는 행들의 집합
    - 보통 SELECT 문의 수행 결과 집합에 대하여 개별적인 행단위 작업을 수행하기 위해 사용한다.
    - 쿼리의 결과 집합에 대해 첫 행부터 마지막 행까지 자동적으로 참조한다.
    - 선택된 행들은 서버 상에서 개별적으로 처리된다.
    - 개발자가 PL/SQL 블럭에서 수동으로 제어가 가능하다. ( 커서 생성 → OPEN → FETCH → CLOSE )
  
  1.2. 종류
  
    (1) 묵시적 커서
    
      - 커서를 명시적으로 생성하지 않은 쿼리 수행시 자동적으로 생성되는 커서
      - 결과가 도출되는 시점에서 OPEN 되고 결과의 출력이 끝나면 CLOSE 된다.
      - 커서 속성
      - 앞에 SQL 이 붙으면 묵시적 커서라는 뜻이고 그 외의 커서는 커서의 이름으로 설정한다.
      
      -------------------------------------------------------------------------------------------------------
        커서 속성                                                                 내용
      -------------------------------------------------------------------------------------------------------
        SQL%ISOPEN                                                     항상 FALSE
        SQL%NOTFOUND                       SQL 문장이 어떠한 영향도 미치지 않았다면 TRUE
        SQL%FOUNT                            SQL 문장이 하나 이상의 행에 영향을 미쳤다면 TRUE 
        SQL%ROWCOUNT                               SQL 문장에 의하여 영향받은 행의 수 
      -------------------------------------------------------------------------------------------------------  
      
      
    EX) 
    DECLARE
      V_NAME LPROD.LPROD_NM%TYPE;
    BEGIN
      SELECT LPROD_NM INTO V_NAME
        FROM LPROD
       WHERE LPROD_ID = 'P102';
       
      IF SQL%FOUND THEN
       DBMS_OUTPUT.PUT_LINE('결과 자료 수 : ' || SQL%ROWCOUNT);
      END IF;
    END;
      
      
      
    EX) 사원테이블에서 부서번호 50번 사원의 급여를 모두 1000만큼 인상하시오.
    
    SELECT * FROM EMP WHERE DEPARTMENT_ID = 50;
    DECLARE
      V_DEPT_ID EMP.DEPARTMENT_ID%TYPE := 50;
    BEGIN
      UPDATE EMP
         SET SALARY = SALARY + 1000
       WHERE DEPARTMENT_ID = V_DEPT_ID;    
      DBMS_OUTPUT.PUT_LINE('갱신된 레코드 수 : ' || SQL%ROWCOUNT);
    END;
    
    (1) 명시적 커서
    
      - 사용자가 직접 생성한 커서(선언부에서 정의)
      - 커서 선언 → 커서 OPEN → FETCH 및 사용 → 커서 CLOSE
      
      1) CURSOR 선언
      
      CURSOR 커서명[(매개변수, 매개변수, ...)]
      IS 
        SELECT 문;
      
      2) CURSOR OPEN
        - 해당 커서를 생성과 OPEN
        
        OPEN 커서명[(값LIST)]; -- 전달해주는 값이 똑같이 MAPPING 되어야한다. = 위치, 타입, 개수가 같아야된다.
        
      3) FETCH 및 사용
        - 커서의 해당 위치의 행을 참조한다.
        - READ 명령과 유사하다.
        
        
        LOOP
          FETCH 커서명 INTO 변수명, 변수명, ... 
          EXIT WHEN 커서명%NOTFOUND
          [처리문;]
        END LOOP;  
      
        . '변수명, 변수명' : 커서에 포함된 열의 값을 할당 받을 변수
      
      
      
      4) CURSOR CLOSE
        - 사용이 종료된 커서를 CLOSE 한다.
        
        CLOSE 커서명;
      
      
      
      
      
      EX) EMP 테이블에서 사원들의 이름만 추출해주는 커서를 SELECT 문으로 커서를 만듦.
      DECLARE 
        V_EMP_NAME EMP.EMP_NAME%TYPE;
        V_SALARY EMP.SALARY%TYPE;
        -- 1. 커서를 생성 및 선언 
        CURSOR CUR_EMP(C_DEPT_ID EMP.DEPARTMENT_ID%TYPE)
        IS
          SELECT EMP_NAME, SALARY
            FROM EMP
           WHERE DEPARTMENT_ID = C_DEPT_ID;
     BEGIN
       -- 2. 커서를 OPEN
       OPEN CUR_EMP(50);
       LOOP
         -- 3. FETCH를 실행
         FETCH CUR_EMP INTO V_EMP_NAME, V_SALARY;
         EXIT WHEN CUR_EMP%NOTFOUND;
         DBMS_OUTPUT.PUT_LINE(V_EMP_NAME || ', ' || V_SALARY);
       END LOOP;  
       DBMS_OUTPUT.PUT_LINE('사원수 : ' || CUR_EMP%ROWCOUNT);
       -- 4. 커서를 CLOSE
       CLOSE CUR_EMP;
     END;