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

논리적 코딩

[PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드
📃 DATABASE/ORACLE

[PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드

2018. 2. 10. 21:08

 [PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드

 [PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드


커서형 레코드

커서를 레코드 변수로 받는 것을 커서형 레코드라고 한다.

커서명%ROWTYPE 형태로 선언한다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DECLARE
    CURSOR C1 IS
    SELECT DEPARTMENT_ID
           , DEPARTMENT_NAME
           , PARENT_ID
           , MANAGER_ID
    FROM   DEPARTMENTS;
    
    VR_DEP C1%ROWTYPE;
BEGIN
    DELETE CH11_DEP;
    
    OPEN C1;
    
    LOOP
        FETCH C1 INTO VR_DEP;
        
        EXIT WHEN C1%NOTFOUND;
        
        INSERT INTO CH11_DEP VALUES VR_DEP;
    END LOOP;
 
    COMMIT;
END;
Colored by Color Scripter
cs


위 예제와 같이, INSERT는 간단하다. 

하지만 만약 테이블의 모든 컬럼을 갱신하려면 SET절에 모든 컬럼과 레코드 변수의 필드를 명시해야하는데, 더 쉽게하는 방법이 없을까?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
DECLARE
    VR_DEP CH11_DEP%ROWTYPE;
BEGIN
    VR_DEP.DEPARTMENT_ID := 20;
    VR_DEP.DEPARTMENT_NAME  := '테스트';
    VR_DEP.PARENT_ID := 10;
    VR_DEP.MANAGER_ID := 200;
    
    UPDATE CH11_DEP
    SET    ROW = VR_DEP
    WHERE  DEPARTMENT_ID = VR_DEP.DEPARTMENT_ID;
    
    COMMIT;
END;
Colored by Color Scripter
cs


위와 같이 ROW 키워드를 사용하면 레코드로 전체 행을 갱신할 수 있는데, 단 해당 테이블의 컬럼 갯수, 순서, 타입과 레코드 필드가 모두 동일해야만한다.

그렇기 때문에, 실제로는 별로 사용하지 않는 편이다.


중첩 레코드

하나의 레코드를 선언하고 또 다른 레코드를 선언할 때 두 번째 레코드의 필드 타입을 첫 번째 레코드 타입으로 선언할 수 있는데, 이것을 중첩 레코드라고 한다.

즉, 레코드의 필드의 데이터 타입이 레코드인것이다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE
    TYPE DEP_REC IS RECORD
    ( DEP_ID    DEPARTMENTS.DEPARTMENT_ID%TYPE
     ,DEP_NAME  DEPARTMENTS.DEPARTMENT_NAME%TYPE );
     
    TYPE EMP_REC IS RECORD
    ( EMP_ID    EMPLOYEES.EMPLOYEE_ID%TYPE
     ,EMP_NAME  EMPLOYEES.EMP_NAME%TYPE
     ,DEP       DEP_REC                     );
     
    VR_EMP_REC EMP_REC;
BEGIN
    SELECT  A.EMPLOYEE_ID,      A.EMP_NAME,             A.DEPARTMENT_ID,        B.DEPARTMENT_NAME
    INTO    VR_EMP_REC.EMP_ID,  VR_EMP_REC.EMP_NAME,    VR_EMP_REC.DEP.DEP_ID,  VR_EMP_REC.DEP.DEP_NAME
    FROM    EMPLOYEES A, DEPARTMENTS B
    WHERE   A.EMPLOYEE_ID = 100
    AND     A.DEPARTMENT_ID = B.DEPARTMENT_ID;
    
    DBMS_OUTPUT.PUT_LINE('EMP_ID : '   || VR_EMP_REC.EMP_ID);
    DBMS_OUTPUT.PUT_LINE('EMP_NAME : ' || VR_EMP_REC.EMP_NAME);
    DBMS_OUTPUT.PUT_LINE('DEP_ID : '   || VR_EMP_REC.DEP.DEP_ID);
    DBMS_OUTPUT.PUT_LINE('DEP_NAME : ' || VR_EMP_REC.DEP.DEP_NAME);
END;
Colored by Color Scripter
cs





 [PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드

 [PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드

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

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

[PL/SQL] 컬렉션 메서드  (0) 2018.02.12
[PL/SQL] 컬렉션(COLLECTION)  (0) 2018.02.11
[PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드  (0) 2018.02.08
[PL/SQL] 커서(CURSOR) (3) : 커서 변수  (0) 2018.02.01
[PL/SQL] 커서(CURSOR) (2) : 커서와 FOR문  (0) 2018.02.01
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] 컬렉션 메서드
    • [PL/SQL] 컬렉션(COLLECTION)
    • [PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드
    • [PL/SQL] 커서(CURSOR) (3) : 커서 변수
    1HOON
    1HOON

    티스토리툴바