RDBMS/Oracle

[PL/SQL] 복합형(레코드/컬렉션)

워터파슬리 2023. 4. 21. 16:11
728x90
반응형

3. 복합형

  • 여러 종류 및 개수의 데이터를 저장하기 위해 사용자가 직접 정의하는 자료형
  • 레코드: 다양한 자료형을 가진 데이터들을 한 번에 저장(테이블의 행과 유사)
  • 컬렉션: 동일한 자료형을 가진 데이터를 여러 개 저장(테이블의 열과 유사, like 배열)



레코드

DECLARE
  TYPE rec_emp IS RECORD(
        name VARCHAR2(200)
       ,salary emp%TYPE
       ,dept_code emp%TYPE
  )
BEGIN
  rec_emp.name := ‘이동욱‘;
  rec_emp.salary := 3000000;
  rec_emp.dept_code := ‘10000678’;
  
  —-레코드를 사용한 INSERT
  INSERT INTO emp
  VALUES rec_emp;
  
  
  rec_emp.salary := 5500000;
  rec_emp.dept_code := ‘10000999’;
  
  —-레코드를 사용한 UPDATE
  UPDATE emp
  SET ROW = rec_emp
  WHERE name = ‘이동욱’
  ;
END
;



컬렉션

  • 특정 자료형의 데이터를 여러 개 저장하는 복합 자려향
  • 종류: *연관 배열, 중첩 테이블, VARRAY

*연관 배열

TYPE 연관배열명 IS TABLE OF 연관배열자료형[NOT NULL] —참조 자료형 사용 가능
INDEX BY 인덱스자료형;
  • 인덱스(key)와 값(value)으로 구성되는 컬렉션
  • 중복되지 않은 유일한 키를 통해 값을 저장하고 불러오는 방식
  • 인덱스는 1부터 시작
  • 사용 빈도가 제일 높은 컬렉션
DECLARE
  idx NUMBER(10) := 0;
  
  TYPE itab_lang IS TABLE OF VARCHAR2(200)
  INDEX BY PLS_INTEGER;
  arr_lang itab_lang;
  
  —-참조 자료형 연관 배열 생성
  TYPE itab_emp IS TABLE OF emp%ROWTYPE
  INDEX BY PLS_INTEGER;
  arr_emp itab_emp;
  
BEGIN
  arr_lang(1) := ‘java’;
  arr_lang(2) := ‘javaScript’;
  arr_lang(3) := ‘sql’;
  arr_lang(4) := ‘python’;
  
  —-LOOP문으로 arr_lang 출력
  LOOP
    idx := idx + 1;
    IF idx > arr_lang.COUNT THEN EXIT;
    END IF;
    dbms_output.put_line(arr_lang(idx));
  END LOOP;

  —-FOR LOOP문으로 arr_lang 출력
  FOR i IN arr_lang.FIRST..arr_lang.LAST LOOP
    dbms_output.put_line(arr_lang(i));
  END LOOP;
  
  idx := 0;
  —-FOR LOOP 응용
  FOR i IN (SELECT * FROM emp) LOOP
    idx := idx + 1;
    arr_emp(idx) := i;
    —-emp 테이블 전체 직원명 출력
    dbms_output.put_line(arr_emp(idx).name);
  END LOOP;

  —-컬렉션을 사용한 INSERT
  INSERT INTO emp2
  VALUES arr_emp(idx)
  ;
END
;



728x90
반응형