레코드 (Record)
레코드는 여러 가지 데이터 타입을 가질 수 있는 복합 자료 구조이며 테이블의 한 개의 행(Row)에 대응한다. 여러 개의 컬럼과 한 개의 행을 가지는 형태로 Java에서 다양한 데이터 타입의 변수를 가지는 클래스와 비슷하다고 볼 수 있다.
레코드는 사용자 정의형, 테이블형, 커서형 레코드로 나뉜다.
1. 사용자 정의형 레코드
사용자 정의형은 사용자가 직접 컬럼 구조를 정의한 레코드이다.
TYPE 레코드명 IS RECORD (
필드명1 데이터타입 [[NOT NULL] := 기본값],
필드명2 데이터타입 [[NOT NULL] := 기본값],
...
);
* 주의
필드가 NOT NULL일 경우 반드시 기본값 옵션을 사용해야 한다.
DECLARE
TYPE R_EMP IS RECORD(
EMP_ID EMPLOYEES.EMPLOYEE_ID%TYPE NOT NULL := 0,
EMP_NM VARCHAR2(100) := 'NO-NAME',
SALARY NUMBER NOT NULL := 0
);
EMP R_EMP;
BEGIN
SELECT EMPLOYEE_ID, FIRST_NAME || ' ' || LAST_NAME AS NAME, SALARY
INTO EMP
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 100;
DBMS_OUTPUT.PUT_LINE('사번 : ' || EMP.EMP_ID);
DBMS_OUTPUT.PUT_LINE('이름 : ' || EMP.EMP_NM);
DBMS_OUTPUT.PUT_LINE('급여 : ' || EMP.SALARY);
END;

2. 테이블형 레코드
테이블형 레코드는 %ROWTYPE 속성을 사용해 특정 테이블을 참조하여 구조를 정의하여 생성한다.
DECLARE
EMP EMPLOYEES%ROWTYPE;
BEGIN
SELECT *
INTO EMP
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 100;
DBMS_OUTPUT.PUT_LINE('사번 : ' || EMP.EMPLOYEE_ID);
DBMS_OUTPUT.PUT_LINE('이름 : ' || EMP.FIRST_NAME);
DBMS_OUTPUT.PUT_LINE('성 : ' || EMP.LAST_NAME);
DBMS_OUTPUT.PUT_LINE('이메일 : ' || EMP.EMAIL);
DBMS_OUTPUT.PUT_LINE('연락처 : ' || EMP.PHONE_NUMBER);
DBMS_OUTPUT.PUT_LINE('입사일 : ' || EMP.HIRE_DATE);
DBMS_OUTPUT.PUT_LINE('직급 코드 : ' || EMP.JOB_ID);
DBMS_OUTPUT.PUT_LINE('급여 : ' || EMP.SALARY);
DBMS_OUTPUT.PUT_LINE('부서 번호 : ' || EMP.DEPARTMENT_ID);
END;

3. 커서형 레코드
커서형 레코드는 커서를 레코드의 변수를 받는 형태이다. 생성된 커서에서 %ROWTYPE 속성을 사용해 그 구조를 그대로 가져온다.
DECLARE
CURSOR CUR_EMP IS
SELECT *
FROM EMPLOYEES
ORDER BY EMPLOYEE_ID;
EMP CUR_EMP%ROWTYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('------------------------------------');
FOR EMP IN CUR_EMP LOOP
DBMS_OUTPUT.PUT_LINE('사번 : ' || EMP.EMPLOYEE_ID);
DBMS_OUTPUT.PUT_LINE('이름 : ' || EMP.FIRST_NAME);
DBMS_OUTPUT.PUT_LINE('성 : ' || EMP.LAST_NAME);
DBMS_OUTPUT.PUT_LINE('이메일 : ' || EMP.EMAIL);
DBMS_OUTPUT.PUT_LINE('연락처 : ' || EMP.PHONE_NUMBER);
DBMS_OUTPUT.PUT_LINE('입사일 : ' || EMP.HIRE_DATE);
DBMS_OUTPUT.PUT_LINE('직급 코드 : ' || EMP.JOB_ID);
DBMS_OUTPUT.PUT_LINE('급여 : ' || EMP.SALARY);
DBMS_OUTPUT.PUT_LINE('부서 번호 : ' || EMP.DEPARTMENT_ID);
DBMS_OUTPUT.PUT_LINE('------------------------------------');
END LOOP;
END;
4. 중첩 레코드
레코드 안에 다른 레코드를 선언하여 사용한다. 즉, 레코드의 필드 타입이 레코드가 되는 것이다. Java로 생각하면 클래스 안에 선언된 또다른 클래스 변수와 비슷한 형태이다.
DECLARE
TYPE R_DEPT IS RECORD(
DEPT_ID DEPARTMENTS.DEPARTMENT_ID%TYPE,
DEPT_NM DEPARTMENTS.DEPARTMENT_NAME%TYPE
);
TYPE R_EMP IS RECORD(
EMP_ID EMPLOYEES.EMPLOYEE_ID%TYPE,
EMP_NM VARCHAR2(100),
SALARY NUMBER := 0,
DEPT R_DEPT
);
EMP R_EMP;
BEGIN
SELECT E.EMPLOYEE_ID, E.FIRST_NAME || ' ' || E.LAST_NAME AS NAME, E.SALARY,
D.DEPARTMENT_ID, D.DEPARTMENT_NAME
INTO EMP.EMP_ID, EMP.EMP_NM, EMP.SALARY,
EMP.DEPT.DEPT_ID, EMP.DEPT.DEPT_NM
FROM EMPLOYEES E, DEPARTMENTS D
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID
AND EMPLOYEE_ID = 100;
DBMS_OUTPUT.PUT_LINE('사번 : ' || EMP.EMP_ID);
DBMS_OUTPUT.PUT_LINE('이름 : ' || EMP.EMP_NM);
DBMS_OUTPUT.PUT_LINE('급여 : ' || EMP.SALARY);
DBMS_OUTPUT.PUT_LINE('부서 번호 : ' || EMP.DEPT.DEPT_ID);
DBMS_OUTPUT.PUT_LINE('부서 명 : ' || EMP.DEPT.DEPT_NM);
END;
'데이터베이스 > Oracle' 카테고리의 다른 글
| [PL/SQL] 컬렉션 (Collection) - 메소드 (0) | 2023.07.13 |
|---|---|
| [PL/SQL] 컬렉션 (Collection) (0) | 2023.07.13 |
| [PL/SQL] BULK COLLECT INTO (0) | 2023.07.11 |
| [PL/SQL] 동적쿼리 (EXECUTE IMMEDIATE) (0) | 2023.07.11 |
| [OracleDB] 두 개의 테이블에서 조인 조건으로 사용할 수 있는 컬럼을 가져오는 함수 (0) | 2023.06.15 |