천재 블로그

[PL/SQL] COMPOSITE - RECORD 타입 본문

프로그래밍/Oracle

[PL/SQL] COMPOSITE - RECORD 타입

Dondons 2019. 6. 19. 14:29



RECORD 데이터 타입의 정의




Composite데이터 타입에는 RECORD, TABLE, 중첩테이블, VARRAY가 있는데, 이 글에서는 RECORD를 설명합니다.


레코드 타입은 필드(여러가지 종류의 속성값)를 하나로 합쳐서 다루는 데이터 타입입니다.

예를 들어 부서번호(넘버형), 부서명(문자형)을 합쳐 「부서형」으로 정의할 수 있는 데이터 타입입니다.


각 필드에 NOT NULL 제약이나 초기값 설정이 가능하나 변수를 선언할 때가 아닌 정의할 때 설정해주어야 합니다.
또한 레코드 타입은 정의한 PL/SQL블록안에서만 사용할 수 있습니다.

레코드 타입의 일반적인 사용방법은 한가지로, 참조한 표의 열의 값을 각 필드에 넣어서 사용가능합니다.
테이블은 다르지만 열의 구성이 같은 행을 다루고 있을 경우 공통의 레코드타입을 정의해두면 테이블별로 데이터타입을 정의할 필요가 없어져 편리합니다.


TYPE 레코드_타입명 IS RECORD

(필드명 데이터_타입 [NOT NULL] [{ := | DEFAULT} {값 | 식 | SQL함수}]

[, 필드명 데이터_타입 [NOT NULL] [{ :=| DEFAULT} {값 | 식 | SQL함수}]

...... ]);




레코드 타입의 정의 예제


부서형을 나타내는 레코드 타입명을 rec_dept라고 하고 부서번호, 부서명의 필드를 각각 deptno NUMBER dname VARCHAR2(20)라고 할 때 아래의 그림처럼 설명할 수 있습니다.





정의 기술방법은 아래의 문장과 같습니다.


1
2
3
4
5
DECLARE
    TYPE rec_dept IS RECORD
        (v_deptno NUMBER
        ,v_dname VARCHAR2(20));
 







레코드 타입의 선언


변수명 레코드타입명;

1

v_rec_dept rec_dept;



레코드 타입을 정의한 뒤 선언해야 사용할 수 있습니다. 




레코드 타입의 참조


변수명.필드명;

INSERT INTO 테이블명 VALUES 레코드타입_변수명;

UPDATE 테이블명 SET ROW = 레코드타입_변수명;



레코드 타입의 참조 예제



INSERT


1
2
3
4
5
6
7
8
9
10
DECLARE
    TYPE rec_dept IS RECORD                        -- RECORD타입의 정의
        (v_deptno NUMBER := 50
        ,v_dname VARCHAR2(14) := '인재개발');
    v_rec_dept rec_dept;                         -- RECORD타입의 선언
BEGIN
    INSERT INTO dept(deptno, dname)
    VALUES(v_rec_dept.v_deptno, v_rec_dept.v_dname); -- 필드를 참조
END;
/



하나의 값만 참조하는 경우 등은 이런식으로 「레코드타입_변수명.필드명」으로 지정해야합니다만,

이 예제처럼 같은 개수의 컬럼을 참조하는 경우는 그냥 레코드타입의 변수명만 적어도 무관합니다.


1
2
3
4
5
6
7
8
9
10
11
DECLARE
    TYPE rec_dept IS RECORD                        -- RECORD타입의 정의
        (v_deptno NUMBER := 50
        ,v_dname VARCHAR2(14) := '인재개발'
        ,v_loc VARCHAR2(13) := '도쿄');
    v_rec_dept rec_dept;                           -- RECORD타입의 선언
BEGIN
    INSERT INTO dept
    VALUES v_rec_dept ; -- 필드를 참조
END;
/



※ 주의! 레코드타입의 변수명만 적어서 사용할 경우, 테이블 컬럼명을 지정하면 에러가 납니다.

   반드시 테이블명만 적어서 사용해야합니다.

1
2
    INSERT INTO dept(deptno, deptname, loc)
    VALUES v_rec_dept ;





UPDATE

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE
    TYPE rec_dept IS RECORD                        -- RECORD타입의 정의
        (v_deptno NUMBER := 40
        ,v_dname VARCHAR2(14) := '관리본부'
        ,v_loc VARCHAR2(13) := '서울');
    v_rec_dept rec_dept;                           -- RECORD타입의 선언
BEGIN
    UPDATE dept
    SET ROW = v_rec_dept
    WHERE deptno = 40;
END;
/




레코드 타입의 참조 결과



INSERT

1
SELECT * FROM dept WHERE deptno = 50;





UPDATE


1
SELECT * FROM dept WHERE deptno = 40;




'프로그래밍 > Oracle' 카테고리의 다른 글

[PL/SQL] IF문  (0) 2019.06.21
[PL/SQL] LOB 데이터 타입  (0) 2019.06.19
[PL/SQL] 스칼라형 데이터타입  (0) 2019.06.19
[PL/SQL] 변수의 대입과 초기값의 정의  (0) 2019.06.18
[PL/SQL] 프로그래밍 주의 사항  (0) 2019.06.18
Comments