1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (187)
    • ☕️ 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 (27)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
      • TIL (1)
    • 🤿 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. 8. 20:31

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

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


레코드(RECORD)

PL/SQL에서 제공하는 데이터 타입 중 하나로, 문자형, 숫자형 같은 기본 빌트인 타입과는 달리 복합형 구조다.

일반 빌트인 타입으로 변수를 선언하면 해당 변수는 한 번에 하나의 값만 가질 수 있지만 레코드는 여러 개의 값을 가질 수 있다.

테이블과 달리 레코드가 가질 수 있는 로우의 수는 단 한 개 뿐이다.

커서라는 것이 테이블에 있는 데이터를 읽어오는 것이므로 데이터 구조적 측면에서 보면 커서도 레코드에 속하기 때문에, 레코드도 커서와 동일한

방식으로 선언한다.


사용자 정의형 레코드

레코드에서 테이블의 컬럼에 해당하는 것을 필드라고 한다.


1
2
3
4
5
6
TYPE 레코드명 IS RECORD
(   필드명1    필드1타입   [[NOT NULL] := 디폴트값],
    필드명2    필드2타입   [[NOT NULL] := 디폴트값],
    ...
);
레코드변수명 레코드명;
cs

예제

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
DECLARE
    -- 부서 레코드 타입 선언
    TYPE DEPART_RECT IS RECORD
    (   DEPARTMENT_ID       DEPARTMENTS.DEPARTMENT_ID%TYPE,
        DEPARTMENT_NAME     DEPARTMENTS.DEPARTMENT_NAME%TYPE,
        PARENT_ID           DEPARTMENTS.PARENT_ID%TYPE,
        MANAGER_ID          DEPARTMENTS.MANAGER_ID%TYPE
    );
        
    -- 위에서 선언된 타입으로 레코드 변수 선언
    VR_DEP  DEPART_RECT;
    -- 두번째 변수 선언
    VR_DEP2  DEPART_RECT;
BEGIN
    VR_DEP.DEPARTMENT_ID    := 999;
    VR_DEP.DEPARTMENT_NAME  := '테스트부서';
    VR_DEP.PARENT_ID        := 100;
    VR_DEP.MANAGER_ID       := NULL;
    
    VR_DEP2 := VR_DEP;
    
    DBMS_OUTPUT.PUT_LINE('VR_DEP2.DEPARTMENT_ID :' || VR_DEP2.DEPARTMENT_ID);
    DBMS_OUTPUT.PUT_LINE('VR_DEP2.DEPARTMENT_NAME :' || VR_DEP2.DEPARTMENT_NAME);
    DBMS_OUTPUT.PUT_LINE('VR_DEP2.PARENT_ID :' || VR_DEP2.PARENT_ID);
    DBMS_OUTPUT.PUT_LINE('VR_DEP2.MANAGER_ID :' || VR_DEP2.MANAGER_ID);
END;
Colored by Color Scripter
cs



위와 같이 레코드에 레코드를 바로 할당 할 수도 있지만, 아래처럼 필드끼리도 할당할 수 있다.


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
DECLARE
    -- 부서 레코드 타입 선언
    TYPE DEPART_RECT IS RECORD
    (   DEPARTMENT_ID       DEPARTMENTS.DEPARTMENT_ID%TYPE,
        DEPARTMENT_NAME     DEPARTMENTS.DEPARTMENT_NAME%TYPE,
        PARENT_ID           DEPARTMENTS.PARENT_ID%TYPE,
        MANAGER_ID          DEPARTMENTS.MANAGER_ID%TYPE
    );
        
    -- 위에서 선언된 타입으로 레코드 변수 선언
    VR_DEP  DEPART_RECT;
    -- 두번째 변수 선언
    VR_DEP2  DEPART_RECT;
BEGIN
    VR_DEP.DEPARTMENT_ID    := 999;
    VR_DEP.DEPARTMENT_NAME  := '테스트부서';
    VR_DEP.PARENT_ID        := 100;
    VR_DEP.MANAGER_ID       := NULL;
    
    -- 필드끼리도 할당 가능
    VR_DEP2.DEPARTMENT_NAME := VR_DEP.DEPARTMENT_NAME;
    
    DBMS_OUTPUT.PUT_LINE('VR_DEP2.DEPARTMENT_ID :' || VR_DEP2.DEPARTMENT_ID);
    DBMS_OUTPUT.PUT_LINE('VR_DEP2.DEPARTMENT_NAME :' || VR_DEP2.DEPARTMENT_NAME);
    DBMS_OUTPUT.PUT_LINE('VR_DEP2.PARENT_ID :' || VR_DEP2.PARENT_ID);
    DBMS_OUTPUT.PUT_LINE('VR_DEP2.MANAGER_ID :' || VR_DEP2.MANAGER_ID);
END;
Colored by Color Scripter
cs



레코드 변수끼리 할당할 때는 두 레코드 변수의 타입(전체 필드의 순서, 구조, 데이터타입)이 같아야하지만, 필드만 할당한다면 두 필드의 데이터 타입만 같으면 된다.

레코드 변수를 사용해 테이블에 INSERT, UPDATE 할 수 있다.



1
2
3
4
5
6
7
8
9
CREATE TABLE CH11_DEP
AS
SELECT  DEPARTMENT_ID
        , DEPARTMENT_NAME
        , PARENT_ID
        , MANAGER_ID
FROM    DEPARTMENTS;
 
TRUNCATE TABLE CH11_DEP;





cs



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 DEPART_RECT IS RECORD
    (   DEPARTMENT_ID       DEPARTMENTS.DEPARTMENT_ID%TYPE,
        DEPARTMENT_NAME     DEPARTMENTS.DEPARTMENT_NAME%TYPE,
        PARENT_ID           DEPARTMENTS.PARENT_ID%TYPE,
        MANAGER_ID          DEPARTMENTS.MANAGER_ID%TYPE
    );
    
    VR_DEP  DEPART_RECT;
BEGIN
    VR_DEP.DEPARTMENT_ID    := 999;
    VR_DEP.DEPARTMENT_NAME  := '테스트부서';
    VR_DEP.PARENT_ID        := 100;
    VR_DEP.MANAGER_ID       := NULL;
    
    INSERT INTO CH11_DEP
    VALUES (VR_DEP.DEPARTMENT_ID, VR_DEP.DEPARTMENT_NAME, VR_DEP.PARENT_ID, VR_DEP.MANAGER_ID);
    
    INSERT  INTO CH11_DEP
    VALUES   VR_DEP;
    
    COMMIT;
END;
Colored by Color Scripter
cs



▼



테이블형 레코드

특정 테이블의 모든 컬럼을 받아 사용하는 레코드를 선언할 때는 %TYPE 대신 %ROWTYPE을 사용한다.


1
레코드변수명 테이블명.%ROWTYPE;
cs

예제

1
2
3
4
5
6
CREATE TABLE CH11_DEP2
AS
SELECT  *
FROM    DEPARTMENTS;
 
TRUNCATE TABLE CH11_DEP2;
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE
    VR_DEP  DEPARTMENTS%ROWTYPE;
BEGIN
    SELECT  *
    INTO    VR_DEP
    FROM    DEPARTMENTS
    WHERE   DEPARTMENT_ID = 20;
    
    INSERT INTO CH11_DEP2
    VALUES VR_DEP;
    
    COMMIT;
END;
cs




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

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

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

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

[PL/SQL] 컬렉션(COLLECTION)  (1) 2018.02.11
[PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드  (0) 2018.02.10
[PL/SQL] 커서(CURSOR) (3) : 커서 변수  (0) 2018.02.01
[PL/SQL] 커서(CURSOR) (2) : 커서와 FOR문  (0) 2018.02.01
[PL/SQL] 커서(CURSOR) (1) : 명시적 커서와 묵시적 커서  (4) 2018.02.01
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] 컬렉션(COLLECTION)
    • [PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드
    • [PL/SQL] 커서(CURSOR) (3) : 커서 변수
    • [PL/SQL] 커서(CURSOR) (2) : 커서와 FOR문
    1HOON
    1HOON

    티스토리툴바