본문 바로가기

DATABASE/RECORD_COLLECTION

01. 자료형이 다른 여러 데이터를 저장하는 레코드

레코드란?

레코드는 자료형이 각기 다른 데이터를 하나의 변수에 저장하는 데 사용한다.

레코드 기본 형식

TYPE 레코드이름 IS RECORD (

변수 이름 자료형 NOT NULL := (또는 DEFAULT) 값 또는 값이 도출되는 표현식

정의한 레코드는 지금까지 다른 변수처럼 기존 자료형처럼 사용할 수 있다. 레코드에 포함된 변수는 레코드 이름과 마침표로 사용할 수 있다.

 

레코드를 사용한 INSERT 

PL/SQL문에서는 테이블에 데이터를 삽입하거나 수정하는 INSERT, UPDATE문에도 레코드를 사용할 수 있다. INSERT문에 레코드를 사용하면 VALUES절에 레코드 이름만 명시해도 된다. 그리고 선언한 레코드와 INSERT 대상이 되는 테이블의 데이터 개수, 자료형, 순서를 맞춰야 한다는 것도 기억해 두자.

DECLARE

    TYPE REC_DEPT IS RECORD(

        deptno NUMBER(2) NOT NULL := 99,

        dname DEPT.DNAME%TYPE,

        loc DEPT.LOC%TYPE );

dept_rec REC_DEPT;

BEGIN

    dept_rec.deptno := 99;

    dept_rec.dname := 'DATABASE' ;

    dept_rec.loc := 'SEOUL' ;

 

INSERT INTO DEPT_RECORD

VALUES dept_rec;

END;

/

 

레코드를 사용한 UPDATE

레코드는 UPDATE문에도 사용할 수 있다. 이 경우에 SET절은 ROW 키워드와 함께 레코드 이름을 명시한다. 기본 UPDATE문에서는 SET절을 통해 변경할 열을 하나하나 지정한 것과 달리 레코드에 저장된 데이터를 사용하여 행 전체의 데이터를 바꿔 준다.

DECLARE

    TYPE REC_DEPT IS RECORD(

        deptno NUMBER(2) NOT NULL := 99;

        dname DEPT.DNAME%TYPE,

        loc DEPT.LOC%TYPE );

    dept_rec REC_DEPT;

BEGIN

    dept_rec.deptno := 50;

    dept_rec.dname := 'DB';

    dept_rec.loc := 'SEOUL' ;

UPDATE DEPT_RECORD

SET ROW = dept_rec

WHERE DEPTNO = 99;

END;

/

 

레코드를 포함하는 레코드

레코드에 포함된 변수의 자료형을 지정할 때 다른 레코드를 지정할 수도 있다. 변수에 레코드형을 적용하면 두개의 마침표로 값을 사용한다. 이렇게 레코드 안에 또 다른 레코드를 포함한 형태를 중첩레코드라고 한다.

 

DECLARE

    TYPE REC_DEPT IS RECORD (

        deptno DEPT.DEPTNO%TYPE,

        dname DEPT.DNAME%TYPE,

        loc DEPT.LOC%TYPE ) ;

    TYPE REC_EMP IS RECORD (

        empno EMP.EMPNO%TYPE,

        ename EMP.ENAME%TYPE,

        dinfo REC_DEPT );

    emp_rec REC_EMP;

BEGIN

    SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC

        INTO emp_rec.empno, emp_rec.ename, emp_rec.dinfo.deptno,

        emp_rec.dinfo.dname, emp_rec.dinfo.loc FROM emp E 

INNER JOIN dept D ON E.deptno = D.deptno

WHERE E.EMPNO = 7788;

 

DBMS_OUTPUT.PUT_LINE( ' EMPNO : ' || emp_rec.emptno);

DBMS_OUTPUT.PUT_LINE( ' ENAME : ' || emp_rec.ename);

 

DBMS_OUTPUT.PUT_LINE( ' DEPTNO : ' || emp_rec.dinfo.deptno);

DBMS_OUTPUT.PUT_LINE( ' DNAME : ' || emp_rec.dinfo.dname);

DBMS_OUTPUT.PUT_LINE( ' LOC : ' || emp_rec.dinfo.loc);

END;

/