PDH 개발 공부

[개발자를 위한 PL-SQL] 12장 - 레코드 본문

DataBase/PL-SQL

[개발자를 위한 PL-SQL] 12장 - 레코드

IFBB 2021. 6. 30. 17:42
  • PL/SQL의 레코드는 C/ C++ 의 구조체 또는 비주얼 베이직과 유사
  • 레코드를 사용하면 데이터 타입이나 길이가 다른 여러 변수들을 논리적으로 하나의 그룹으로 묶을수 있다.
  • 예를 들면 사원명 , 사번 , 부서 번호 , 입사 일자와 같은 사원에 대한 정보들을 '사원 정보'라는 레코드로 묶을수 있다.

사용법

TYPE 타입명 IS RECORD (필드 목록);
레코드변수명 타입명;
DECLARE
 TYPE emp_type IS RECORD( -- 세 개의 필드를 가지는 레코드 선언
  empno NUMBER(4) NOT NULL := 0, -- NOT NULL 필드는 반드시 초깃값을 지정해야 함
  ename emp.ename%TYPE, -- 칼럼 앵커를 사용한 필드 선언
  job VARCHAR2(9) -- 필드의 데이터 타입을 직접 지정
  );
  v_emp emp_type; -- 타입을 사용하여 변수(인스턴스)선언
BEGIN
 -- 레코드의 필드에 값을 할당
 v_emp.empno := 9000;
 v_emp.ename := '홍길동';
 v_emp.job := '의적';

 DBMS_OUTPUT.PUT_LINE('EMPNO =' || v_emp.empno );
 DBMS_OUTPUT.PUT_LINE('ENAME =' || v_emp.ename );
 DBMS_OUTPUT.PUT_LINE('JOB =' || v_emp.job );
END;

실행결과

EMPNO = 9000
ENAME = 홍길동
JOB = 의적

레코드 속성

  • 레코드의 필드명과 SELECT되는 테이블의 칼럼명과는 일치하지 않도 된다. (데이터 타입과 길이는 호환성만 있으면 된다.
emp_no NUMBER(4) 에서 -- empno 대신 emp_no 사용
  • 레코드 변수는 하나만 사용 가능하며 다른 변수와 같이 사용할 수 없다.
INTO v_emp_basic , v_emp_salary // 를 사용 했을떄 두개의 레코드 변수를 INTO 할 수 없다.

레코드 변수에 값 할당

DECLARE
  TYPE emp_rec IS RECORD (
    empno emp.empno%TYPE,
    ename emp.ename%TYPE
  );

  v_emp1 emp_rec;
  v_emp2 emp_rec;
  v_emp3 emp_rec;
BEGIN
  v_emp1.empno := 9000 ; v_emp1.ename := '홍길동'; -- 1. 필드별로 값을 할당
  v_emp2 := v_emp1;                                -- 2. 다른 레코드를 복사
  SELECT empno, ename INTO v_emp3                  -- 3. 쿼리 결과를 레코드에 저장
    FROM emp
   WHERE empno = 7788;
END;
  • 필드가 동일하더라도 타입명이 다른 레코드 간에는 할당 연산이 불가능
v_emp1 , v_emp2 필드가 동일 하다고 가정 했을때 v_emp1 :=  v_emp2 가 되지 않는다.

레코드와 컬렉션의 혼합


DECLARE
  TYPE city_tab_type IS TABLE OF VARCHAR2(64) INDEX BY PLS_INTEGER ; -- 컬렉션
  TYPE name_rec IS RECORD (                                      -- 레코드
    first_name  VARCHAR2(30),
    last_name   VARCHAR2(30)
  ) ;
  TYPE emp_rec IS RECORD (                                       -- 컬렉션과 레코드의 혼합
    empno emp.empno%TYPE DEFAULT 1000,
    ename name_rec,      -- 레코드가 레코드의 필드가 될 수 있다.
    city  city_tab_type  -- 컬렉션이 레코드의 필드가 될 수 있다.
  );
  TYPE people_type IS VARRAY(10) OF name_rec ; -- 레코드의 컬렉션이 가능하다. 
  TYPE emp_type    IS VARRAY(10) OF emp_rec  ; -- 레코드의 컬렉션
BEGIN
  NULL ;
END;

'DataBase > PL-SQL' 카테고리의 다른 글

[개발자를 위한 PL/SQL] 11장 - 컬렉션  (0) 2021.06.29
Comments