[PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드
[PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드
커서형 레코드
커서를 레코드 변수로 받는 것을 커서형 레코드라고 한다.
커서명%ROWTYPE 형태로 선언한다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | DECLARE CURSOR C1 IS SELECT DEPARTMENT_ID , DEPARTMENT_NAME , PARENT_ID , MANAGER_ID FROM DEPARTMENTS; VR_DEP C1%ROWTYPE; BEGIN DELETE CH11_DEP; OPEN C1; LOOP FETCH C1 INTO VR_DEP; EXIT WHEN C1%NOTFOUND; INSERT INTO CH11_DEP VALUES VR_DEP; END LOOP; COMMIT; END; | cs |
위 예제와 같이, INSERT는 간단하다.
하지만 만약 테이블의 모든 컬럼을 갱신하려면 SET절에 모든 컬럼과 레코드 변수의 필드를 명시해야하는데, 더 쉽게하는 방법이 없을까?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | DECLARE VR_DEP CH11_DEP%ROWTYPE; BEGIN VR_DEP.DEPARTMENT_ID := 20; VR_DEP.DEPARTMENT_NAME := '테스트'; VR_DEP.PARENT_ID := 10; VR_DEP.MANAGER_ID := 200; UPDATE CH11_DEP SET ROW = VR_DEP WHERE DEPARTMENT_ID = VR_DEP.DEPARTMENT_ID; COMMIT; END; | cs |
위와 같이 ROW 키워드를 사용하면 레코드로 전체 행을 갱신할 수 있는데, 단 해당 테이블의 컬럼 갯수, 순서, 타입과 레코드 필드가 모두 동일해야만한다.
그렇기 때문에, 실제로는 별로 사용하지 않는 편이다.
중첩 레코드
하나의 레코드를 선언하고 또 다른 레코드를 선언할 때 두 번째 레코드의 필드 타입을 첫 번째 레코드 타입으로 선언할 수 있는데, 이것을 중첩 레코드라고 한다.
즉, 레코드의 필드의 데이터 타입이 레코드인것이다.
예제
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 DEP_REC IS RECORD ( DEP_ID DEPARTMENTS.DEPARTMENT_ID%TYPE ,DEP_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE ); TYPE EMP_REC IS RECORD ( EMP_ID EMPLOYEES.EMPLOYEE_ID%TYPE ,EMP_NAME EMPLOYEES.EMP_NAME%TYPE ,DEP DEP_REC ); VR_EMP_REC EMP_REC; BEGIN SELECT A.EMPLOYEE_ID, A.EMP_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_NAME INTO VR_EMP_REC.EMP_ID, VR_EMP_REC.EMP_NAME, VR_EMP_REC.DEP.DEP_ID, VR_EMP_REC.DEP.DEP_NAME FROM EMPLOYEES A, DEPARTMENTS B WHERE A.EMPLOYEE_ID = 100 AND A.DEPARTMENT_ID = B.DEPARTMENT_ID; DBMS_OUTPUT.PUT_LINE('EMP_ID : ' || VR_EMP_REC.EMP_ID); DBMS_OUTPUT.PUT_LINE('EMP_NAME : ' || VR_EMP_REC.EMP_NAME); DBMS_OUTPUT.PUT_LINE('DEP_ID : ' || VR_EMP_REC.DEP.DEP_ID); DBMS_OUTPUT.PUT_LINE('DEP_NAME : ' || VR_EMP_REC.DEP.DEP_NAME); END; | cs |
반응형
'📃 DATABASE > ORACLE' 카테고리의 다른 글
[PL/SQL] 컬렉션 메서드 (0) | 2018.02.12 |
---|---|
[PL/SQL] 컬렉션(COLLECTION) (0) | 2018.02.11 |
[PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드 (0) | 2018.02.08 |
[PL/SQL] 커서(CURSOR) (3) : 커서 변수 (0) | 2018.02.01 |
[PL/SQL] 커서(CURSOR) (2) : 커서와 FOR문 (0) | 2018.02.01 |