[PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드
[PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드
레코드(RECORD)
PL/SQL에서 제공하는 데이터 타입 중 하나로, 문자형, 숫자형 같은 기본 빌트인 타입과는 달리 복합형 구조다.
일반 빌트인 타입으로 변수를 선언하면 해당 변수는 한 번에 하나의 값만 가질 수 있지만 레코드는 여러 개의 값을 가질 수 있다.
테이블과 달리 레코드가 가질 수 있는 로우의 수는 단 한 개 뿐이다.
커서라는 것이 테이블에 있는 데이터를 읽어오는 것이므로 데이터 구조적 측면에서 보면 커서도 레코드에 속하기 때문에, 레코드도 커서와 동일한
방식으로 선언한다.
사용자 정의형 레코드
레코드에서 테이블의 컬럼에 해당하는 것을 필드라고 한다.
1 2 3 4 5 6 | TYPE 레코드명 IS RECORD ( 필드명1 필드1타입 [[NOT NULL] := 디폴트값], 필드명2 필드2타입 [[NOT NULL] := 디폴트값], ... ); 레코드변수명 레코드명; | cs |
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | DECLARE -- 부서 레코드 타입 선언 TYPE DEPART_RECT IS RECORD ( DEPARTMENT_ID DEPARTMENTS.DEPARTMENT_ID%TYPE, DEPARTMENT_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE, PARENT_ID DEPARTMENTS.PARENT_ID%TYPE, MANAGER_ID DEPARTMENTS.MANAGER_ID%TYPE ); -- 위에서 선언된 타입으로 레코드 변수 선언 VR_DEP DEPART_RECT; -- 두번째 변수 선언 VR_DEP2 DEPART_RECT; BEGIN VR_DEP.DEPARTMENT_ID := 999; VR_DEP.DEPARTMENT_NAME := '테스트부서'; VR_DEP.PARENT_ID := 100; VR_DEP.MANAGER_ID := NULL; VR_DEP2 := VR_DEP; DBMS_OUTPUT.PUT_LINE('VR_DEP2.DEPARTMENT_ID :' || VR_DEP2.DEPARTMENT_ID); DBMS_OUTPUT.PUT_LINE('VR_DEP2.DEPARTMENT_NAME :' || VR_DEP2.DEPARTMENT_NAME); DBMS_OUTPUT.PUT_LINE('VR_DEP2.PARENT_ID :' || VR_DEP2.PARENT_ID); DBMS_OUTPUT.PUT_LINE('VR_DEP2.MANAGER_ID :' || VR_DEP2.MANAGER_ID); END; | cs |
위와 같이 레코드에 레코드를 바로 할당 할 수도 있지만, 아래처럼 필드끼리도 할당할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | DECLARE -- 부서 레코드 타입 선언 TYPE DEPART_RECT IS RECORD ( DEPARTMENT_ID DEPARTMENTS.DEPARTMENT_ID%TYPE, DEPARTMENT_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE, PARENT_ID DEPARTMENTS.PARENT_ID%TYPE, MANAGER_ID DEPARTMENTS.MANAGER_ID%TYPE ); -- 위에서 선언된 타입으로 레코드 변수 선언 VR_DEP DEPART_RECT; -- 두번째 변수 선언 VR_DEP2 DEPART_RECT; BEGIN VR_DEP.DEPARTMENT_ID := 999; VR_DEP.DEPARTMENT_NAME := '테스트부서'; VR_DEP.PARENT_ID := 100; VR_DEP.MANAGER_ID := NULL; -- 필드끼리도 할당 가능 VR_DEP2.DEPARTMENT_NAME := VR_DEP.DEPARTMENT_NAME; DBMS_OUTPUT.PUT_LINE('VR_DEP2.DEPARTMENT_ID :' || VR_DEP2.DEPARTMENT_ID); DBMS_OUTPUT.PUT_LINE('VR_DEP2.DEPARTMENT_NAME :' || VR_DEP2.DEPARTMENT_NAME); DBMS_OUTPUT.PUT_LINE('VR_DEP2.PARENT_ID :' || VR_DEP2.PARENT_ID); DBMS_OUTPUT.PUT_LINE('VR_DEP2.MANAGER_ID :' || VR_DEP2.MANAGER_ID); END; | cs |
레코드 변수끼리 할당할 때는 두 레코드 변수의 타입(전체 필드의 순서, 구조, 데이터타입)이 같아야하지만, 필드만 할당한다면 두 필드의 데이터 타입만 같으면 된다.
레코드 변수를 사용해 테이블에 INSERT, UPDATE 할 수 있다.
1 2 3 4 5 6 7 8 9 | CREATE TABLE CH11_DEP AS SELECT DEPARTMENT_ID , DEPARTMENT_NAME , PARENT_ID , MANAGER_ID FROM DEPARTMENTS; TRUNCATE TABLE CH11_DEP; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | DECLARE TYPE DEPART_RECT IS RECORD ( DEPARTMENT_ID DEPARTMENTS.DEPARTMENT_ID%TYPE, DEPARTMENT_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE, PARENT_ID DEPARTMENTS.PARENT_ID%TYPE, MANAGER_ID DEPARTMENTS.MANAGER_ID%TYPE ); VR_DEP DEPART_RECT; BEGIN VR_DEP.DEPARTMENT_ID := 999; VR_DEP.DEPARTMENT_NAME := '테스트부서'; VR_DEP.PARENT_ID := 100; VR_DEP.MANAGER_ID := NULL; INSERT INTO CH11_DEP VALUES (VR_DEP.DEPARTMENT_ID, VR_DEP.DEPARTMENT_NAME, VR_DEP.PARENT_ID, VR_DEP.MANAGER_ID); INSERT INTO CH11_DEP VALUES VR_DEP; COMMIT; END; | cs |
테이블형 레코드
특정 테이블의 모든 컬럼을 받아 사용하는 레코드를 선언할 때는 %TYPE 대신 %ROWTYPE을 사용한다.
1 | 레코드변수명 테이블명.%ROWTYPE; | cs |
예제
1 2 3 4 5 6 | CREATE TABLE CH11_DEP2 AS SELECT * FROM DEPARTMENTS; TRUNCATE TABLE CH11_DEP2; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 | DECLARE VR_DEP DEPARTMENTS%ROWTYPE; BEGIN SELECT * INTO VR_DEP FROM DEPARTMENTS WHERE DEPARTMENT_ID = 20; INSERT INTO CH11_DEP2 VALUES VR_DEP; COMMIT; END; | cs |
반응형
'📃 DATABASE > ORACLE' 카테고리의 다른 글
[PL/SQL] 컬렉션(COLLECTION) (0) | 2018.02.11 |
---|---|
[PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드 (0) | 2018.02.10 |
[PL/SQL] 커서(CURSOR) (3) : 커서 변수 (0) | 2018.02.01 |
[PL/SQL] 커서(CURSOR) (2) : 커서와 FOR문 (0) | 2018.02.01 |
[PL/SQL] 커서(CURSOR) (1) : 명시적 커서와 묵시적 커서 (4) | 2018.02.01 |