PDH 개발 공부
[개발자를 위한 PL-SQL] 12장 - 레코드 본문
- 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 |
---|