자료형이 다른 여러 데이터를 저장하는 레코드
📚자료형
- 스칼라: 단일값- 숫자, 문자열, 날짜, 논리형
- NUMBER: 숫자
- CHAR
- VARCHAR2
- DATE: 날짜
- BOOLEAN: 논리형, true, fale, NULL
- LOB: Large OBject - CLOB, BLOB
- 참조형
테이블.컬럼%TYPE: 특정 테이블의 컬럼의 자료형을 참조테이블%ROWTYPE: 특정 테이블의 모든 컬럼들을 참조- 복합형
- RECORD: 여러 변수와 자료형을 한꺼번에 선언하는 방식 / 레코드
- TABLE(컬렉션): 키 - 값 형태
TYPE 레코드 이름 IS RECORD(
변수 이름 자료형 NOT NULL := (또는 DEFAULT) 값 또는 값이 도출되는 여러 표현식
);
DECLARE
TYPE REC_DEPT IS RECORD(
DEPTNO DEPT.DEPTNO%TYPE,
DNAME DEPT.DNAME%TYPE,
LOC DEPT.LOC%TYPE
);
DEPT_DATA REC_DEPT;
BEGIN
DEPT_DATA.DEPTNO := 99;
DEPT_DATA.DNAME := 'DATABASE';
DEPT_DATA.LOC := 'SEOUL';
DBMS_OUTPUT.PUT_LINE('DEPTNO: '|| DEPT_DATA.DEPTNO);
DBMS_OUTPUT.PUT_LINE('DNAME: '|| DEPT_DATA.DNAME);
DBMS_OUTPUT.PUT_LINE('LOC: '|| DEPT_DATA.LOC);
END;
/*
DEPTNO: 99
DNAME: DATABASE
LOC: SEOUL
*/
1) DEPT_RECORD 테이블 생성하기
CREATE TABLE DEPT_RECORD AS SELECT * FROM DEPT;
2) 레코드를 사용하여 INSERT 하기
INSERT INTO DEPT_RECORD VALUES DEPT_DATA;
DECLARE
TYPE REC_DEPT IS RECORD(
DEPTNO DEPT.DEPTNO%TYPE,
DNAME DEPT.DNAME%TYPE,
LOC DEPT.LOC%TYPE
);
-- DEPT_DATA 변수 선언
DEPT_DATA REC_DEPT;
BEGIN
DEPT_DATA.DEPTNO := 99;
DEPT_DATA.DNAME := 'DATABASE';
DEPT_DATA.LOC := 'SEOUL';
INSERT INTO DEPT_RECORD VALUES DEPT_DATA;
END;
UPDATE DEPT_RECORD
SET ROW = DEPT_DATA
WHERE DEPTNO = 99;
DECLARE
TYPE REC_DEPT IS RECORD(
DEPTNO DEPT.DEPTNO%TYPE,
DNAME DEPT.DNAME%TYPE,
LOC DEPT.LOC%TYPE
);
-- DEPT_DATA 변수 선언
DEPT_DATA REC_DEPT;
BEGIN
DEPT_DATA.DEPTNO := 99;
DEPT_DATA.DNAME := 'DB';
DEPT_DATA.LOC := 'INCHEON';
--INSERT INTO DEPT_RECORD VALUES DEPT_DATA;
UPDATE DEPT_RECORD
SET ROW = DEPT_DATA
WHERE DEPTNO = 99;
END;
1) 레코드에 포함된 변수의 자료형을 지정할 때 다른 레코드를 지정할 수도 있습니다.
2) 레코드에 다른 레코드 포함하기
👩🏫참고)
단일조회 값을 변수에 넣는 방법
SELECT 필드명, ...INTO 변수, ...FROM...WHERE..
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_DATA REC_EMP;
BEGIN
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC
INTO
EMP_DATA.EMPNO,
EMP_DATA.ENAME,
EMP_DATA.DINFO.DEPTNO,
EMP_DATA.DINFO.DNAME,
EMP_DATA.DINFO.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.ENAME='SCOTT';
DBMS_OUTPUT.PUT_LINE('EMPNO : ' || EMP_DATA.EMPNO);
DBMS_OUTPUT.PUT_LINE('ENAME : ' || EMP_DATA.ENAME);
DBMS_OUTPUT.PUT_LINE('DEPTNO : ' || EMP_DATA.DINFO.DEPTNO);
DBMS_OUTPUT.PUT_LINE('DNAME : ' || EMP_DATA.DINFO.DNAME);
DBMS_OUTPUT.PUT_LINE('LOC : ' || EMP_DATA.DINFO.LOC);
END;
/*
EMPNO : 7788
ENAME : SCOTT
DEPTNO : 20
DNAME : RESEARCH
LOC : DALLAS
*/
1) 인덱스라고 불리는 키(key), 값(value)으로 구성되는 컬렉션
TYPE 연관 배열 이름 IS TABLE OF 자료형 [NOT NULL]
INDEX BY 인덱스형;
4) 연관 배열 사용하기
#숫자
DECLARE
TYPE TYPE1 IS TABLE OF VARCHAR2(20)
INDEX BY PLS_INTEGER; --숫자
TEXT_ARR TYPE1; --변수정의
BEGIN
TEXT_ARR(1) := '첫번째';
TEXT_ARR(2) := '두번째';
TEXT_ARR(3) := '세번째';
TEXT_ARR(4) := '네번째';
FOR i IN 1..4 LOOP
DBMS_OUTPUT.PUT_LINE('TEXT_ARR(' || i || ') : ' || TEXT_ARR(i));
END LOOP;
END;
/*
TEXT_ARR(1) : 첫번째
TEXT_ARR(2) : 두번째
TEXT_ARR(3) : 세번째
TEXT_ARR(4) : 네번째
*/
#문자열

5) 연관 배열 자료형에 레코드 사용하기
DECLARE
TYPE REC_DEPT IS RECORD(
DEPTNO DEPT.DEPTNO%TYPE,
DNAME DEPT.DNAME%TYPE
);
TYPE TYPE_DEPT IS TABLE OF REC_DEPT
INDEX BY PLS_INTEGER;
DEPT_ARR TYPE_DEPT;
IDX PLS_INTEGER := 1;
BEGIN
FOR d IN (SELECT DEPTNO, DNAME FROM DEPT) LOOP
DEPT_ARR(IDX).DEPTNO := d.DEPTNO;
DEPT_ARR(IDX).DNAME := d.DNAME;
DBMS_OUTPUT.PUT_LINE(DEPT_ARR(IDX).DEPTNO ||
' : ' || DEPT_ARR(IDX).DNAME);
IDX := IDX + 1;
END LOOP;
END;
/*
10 : ACCOUNTING
20 : RESEARCH
30 : SALES
40 : OPERATIONS
*/