[SQL응용] 레코드와 컬렉션

예지성준·2024년 5월 20일

DB

목록 보기
17/19
post-thumbnail

레코드와 컬렉션

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

📚자료형

  • 스칼라: 단일값- 숫자, 문자열, 날짜, 논리형
    • NUMBER: 숫자
    • CHAR
    • VARCHAR2
    • DATE: 날짜
    • BOOLEAN: 논리형, true, fale, NULL
  • LOB: Large OBject - CLOB, BLOB
  • 참조형
    • 테이블.컬럼%TYPE: 특정 테이블의 컬럼의 자료형을 참조
    • 테이블%ROWTYPE: 특정 테이블의 모든 컬럼들을 참조
  • 복합형
    • RECORD: 여러 변수와 자료형을 한꺼번에 선언하는 방식 / 레코드
    • TABLE(컬렉션): 키 - 값 형태

1. 레코드란?

  • 각기 다른 데이터를 하나의 변수에 저장하는 데 사용
  • 레코드에 포함된 변수는 레코드 이름과 마침표(.)로 사용할 수 있습니다.

2. 형식

TYPE 레코드 이름 IS RECORD(
    변수 이름 자료형 NOT NULL := (또는 DEFAULT) 값 또는 값이 도출되는 여러 표현식
);

3. 레코드 정의해서 사용하기

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
*/

4. 레코드를 사용한 INSERT

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;

5. 레코드를 포함하는 레코드

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. 연관배열

1) 인덱스라고 불리는 키(key), 값(value)으로 구성되는 컬렉션

  • 인덱스: 정수, 문자
    2) 중복되지 않은 유일한 키를 통해 값을 저장하고 불러오는 방식을 사용
    3) 형식
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
*/

2. 컬렉션 메서드

강의자료

profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글