1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (186)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (26)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

📃 DATABASE/ORACLE

[PL/SQL] 커서(CURSOR) (3) : 커서 변수

2018. 2. 1. 14:36

 [PL/SQL] 커서(CURSOR) (1) : 명시적 커서와 묵시적 커서

 [PL/SQL] 커서(CURSOR) (2) : 커서와 FOR문

 [PL/SQL] 커서(CURSOR) (3) : 커서변수


커서 변수

특징

- 한 개 이상의 쿼리를 연결해 사용할 수 있다.

  하나의 커서 변수를 선언해 쿼리를 연결해서 사용한 뒤, 같은 커서 변수를 또 다른 쿼리에 연결해서 사용할 수 있다.

- 변수처럼 커서 변수를 함수나 프로시저의 매개변수로 전달할 수 있다.

- 커서 속성을 사용할 수 있다.


사용방법

1. 커서 변수 선언하기

1
2
TYPE 커서_타입명 IS REF CURSOR [ RETURN 반환 타입 ];
커서_변수명 커서_타입명;
cs


반환타입은 해당 커서가 반환하는 결과 집합을 나타내며 '%ROWTYPE' 속성으로 정의한다.

RETURN 반환 타입은 생략가능하며, 생략시 약한커서타입, 생략하지않으면 강한커서타입이 된다.


오라클 빌트인 커서 타입인 SYS_REFCURSOR 사용한다. RETURN을 쓰지 않으므로 당연히 약한 커서 타입이 된다.

1
TEST_CURSOR SYS_REFCURSOR;
cs


2. 커서 변수 사용하기

1
OPEN 커서변수명 FOR SELECT 문;
cs


선언한 커서 타입이 약한 커서 타입이면 커서 결과 집합의 종류가 다양해진다.


만약 강한 커서 타입을 선언한다면 아래와 같이 선언하는데,

1
2
TYPE TEST_CURTYPE IS REF CURSOR RETURN DEPARTMENTS%ROWTYPE;
TEST_CURVAR TEST_CURTYPE;
Colored by Color Scripter
cs


1
2
OPEN TEST_CURVAR FOR SELECT  *
                     FROM    DEPARTMENTS;
cs

위 처럼 커서 변수를 사용할 수 있지만 아래 처럼 커서 타입과 다르게는 사용할 수 없다.

1
2
OPEN TEST_CURVAR FOR SELECT  DEPARTMENT_ID
                     FROM    DEPARTMENTS;
cs

    

그런데 약한 커서 타입을 선언하면 위 두 방식 모두 사용할 수 있다.

1
2
TYPE TEST_CURTYPE IS REF CURSOR;
TEST_CURVAR TETS_CURTYPE;
cs

1
2
OPEN TEST_CURVAR FOR SELECT  *
                     FROM    DEPARTMENTS;
cs
1
2
OPEN TEST_CURVAR FOR SELECT  DEPARTMENT_ID
                     FROM    DEPARTMENTS;
cs


3. 커서 변수에서 결과 집합 가져오기

1
FETCH 커서변수명 INTO 변수1, 변수2, ...;
cs
1
FETCH 커서변수명 INTO 레코드명;
cs

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DECLARE
    VS_EMP_NAME     EMPLOYEES.EMP_NAME%TYPE;
    
    TYPE    EMP_DEP_CURTYPE IS REF CURSOR;
    EMP_DEP_CURVAR EMP_DEP_CURTYPE;
BEGIN
    OPEN    EMP_DEP_CURVAR  FOR SELECT  EMP_NAME
                                FROM    EMPLOYEES
                                WHERE   DEPARTMENT_ID = 90;
    
    LOOP
        FETCH   EMP_DEP_CURVAR INTO    VS_EMP_NAME;
        
        EXIT    WHEN EMP_DEP_CURVAR%NOTFOUND;
        
        DBMS_OUTPUT.PUT_LINE(VS_EMP_NAME);
    END LOOP;
END;
Colored by Color Scripter
cs

SYS_REFCURSOR 를 이용한 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE
    VS_EMP_NAME     EMPLOYEES.EMP_NAME%TYPE;
    
    EMP_DEP_CURVAR SYS_REFCURSOR;
BEGIN
    OPEN    EMP_DEP_CURVAR  FOR SELECT  EMP_NAME
                                FROM    EMPLOYEES
                                WHERE   DEPARTMENT_ID = 90;
    
    LOOP
        FETCH   EMP_DEP_CURVAR INTO    VS_EMP_NAME;
        
        EXIT    WHEN EMP_DEP_CURVAR%NOTFOUND;
        
        DBMS_OUTPUT.PUT_LINE(VS_EMP_NAME);
    END LOOP;
END;
Colored by Color Scripter
cs


4. 커서 변수를 매개변수로 전달하기

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
DECLARE
    VS_EMP_NAME     EMPLOYEES.EMP_NAME%TYPE;
    -- 커서 변수 선언
    EMP_DEP_CURVAR  SYS_REFCURSOR;
    
    -- 프로시저 정의 매개변수는 SYS_REFCURSOR 타입의 IN OUT형
    PROCEDURE   TEST_CURSOR_ARGU ( P_CURVAR IN OUT SYS_REFCURSOR )
    IS
        C_TEMP_CURVAR   SYS_REFCURSOR;
    BEGIN
        OPEN    C_TEMP_CURVAR FOR   SELECT  EMP_NAME
                                    FROM    EMPLOYEES
                                    WHERE   DEPARTMENT_ID = 90;
        
        P_CURVAR := C_TEMP_CURVAR;
    END;
BEGIN
    -- 프로시저 호출
    TEST_CURSOR_ARGU(EMP_DEP_CURVAR);
    
    -- 전달받은 매개변수를 출력
    LOOP
        FETCH   EMP_DEP_CURVAR INTO VS_EMP_NAME;
        
        EXIT    WHEN EMP_DEP_CURVAR%NOTFOUND;
        
        DBMS_OUTPUT.PUT_LINE(VS_EMP_NAME);
    END LOOP;
END;
Colored by Color Scripter
cs




 [PL/SQL] 커서(CURSOR) (1) : 명시적 커서와 묵시적 커서

 [PL/SQL] 커서(CURSOR) (2) : 커서와 FOR문

 [PL/SQL] 커서(CURSOR) (3) : 커서변수

반응형
저작자표시 비영리 변경금지 (새창열림)

'📃 DATABASE > ORACLE' 카테고리의 다른 글

[PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드  (0) 2018.02.10
[PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드  (0) 2018.02.08
[PL/SQL] 커서(CURSOR) (2) : 커서와 FOR문  (0) 2018.02.01
[PL/SQL] 커서(CURSOR) (1) : 명시적 커서와 묵시적 커서  (4) 2018.02.01
[PL/SQL] 트랜잭션  (1) 2018.01.29
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드
    • [PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드
    • [PL/SQL] 커서(CURSOR) (2) : 커서와 FOR문
    • [PL/SQL] 커서(CURSOR) (1) : 명시적 커서와 묵시적 커서
    1HOON
    1HOON

    티스토리툴바