DB/ORACLE

29.[오라클]레코드

혼자좀비 2024. 3. 6. 23:30

 레코드는 일반 빌트인 타입으로 변수를 선언하면 해당 변수는 한번에 하나의 값만 가질수 있지만 레코드는 여러개의 값을 가질수 있는 복합형 구조이다.

 해당 측면에서 보면 테이블과 흡사하며 테이블과 다른점이 있다면 테이블은 여러개의 로우를 가지수 있는 2차원 형태인데 레코드는 가질수 있는 로우의 수는 딱 한개만 가질수 있다.

 따라서 레코드는 서로 다른 유형의 데이터 타입을 가진 변수 여러개가 한줄로 붙어있는 형태라고 이해 할수 있다.

1.사용자형 레코드

사용자가 직접 레코드를 정의하고 선언해 사용할 수 있다.
TYPE 레코드명 IS RECORD (
   필드명1 필드1 타입 [[NOT NULL] := 디폴트값],
   필드명2 필드2 타입 [[NOT NULL] := 디폴트값]
.........
);
레코드변수명 레코드명;
 커서 변수처럼 레코드도 먼저 타입을 선언한 후 해당 타입에 대한 변수를 선언한다.

위의 그림과 같이 vr_dep과 vr_dep2라는 두개의 레코드 변수를 선언한 후 vr_dep변수의 필드의 값을 채워 vr-dep2로 vr_dep를 할당하여 vr_dep2의 각 필드 값을 출력하였다. 이처럼 동일한 타입의 레코드 변수를 할당하면 모든 필드값이 할당된다. 그리고 아래와 같이 레코드 전체가 아닌 필드값으로 할당이 가능하다.

 

아래의 이미지와 같이 레코드 변수를 사용하여 테이블에 insert,update도 할수 있다.

 

2. 테이블형 레코드

 특정 테이블의 컬럼값을 받아오는 변수를 선언할때 굳이 해당 컬럼의 데이터 타입을 찾을 필요가 없었다.

 - 변수명 테이블명.컬럼명%TYPE;

반면 특정 테이블의 모든 컬럼을 받아 사용하는 레코드를 선언할 경우 %TYPE대신 %ROWTYPE로 선언한다.

 - 레코드변수명 테이블명.%ROWTYPE;

이러한 형태를 테이블형 레코드 변수라고 하고 이런 형태의 레코드 변수는 해당 테이블의 모든 컬럼을 필드로 가진다.

3. 커서형 레코드

커서를 레코드 변수로 받는 것을 커서형 레코드라 한다. 커서형 레코드 변수 역시 테이블형 레코드처럼 %ROWTYPE을 사용하여 테이블명 대신 커서명%ROWTYPE형태로 선언한다.

위의 이미지와 같이 조회한 테이블을 명시적 커서를 선언하여 해당 커서를 LOOP를 돌려 TEST_DEP테이블에 INSERT를 하게 했다.

 

 커서로 테이블의 모든 컬럼을 갱신할 경우 SET절에 모든 컬럼과 레코드 변수의 필드를 명시해야 하는 불편함이 있다. INSERT문처럼 컬럼수와 순서,타입이 같을 경우 간단히 레코드 변수만 기술하여 UPDATE 할수 있게 SET절에 ROW키워드를 사용하여 레코드로 전체 행을 갱신할수있다.(단 해당테이블의 컬럼개수,순서,타입과 레코드의 필드가 모두 동일해야함.)

 

4. 중첩 레코드

하나의 레코드를 선언하고 또다른 레코드를 선언할 경우 두번째 레코드의 필드 타입을 첫번째 레코드 타입으로 선언할수 있는데 이러한 형태의 레코드를 중첩 레코드라고 한다.

emp_rec라는 레코드 타입에 dep라는 필드가 있는데 이 dep필드는 부서번호와 부서명을 필드로 가진 dep_rec라는 레코드 타입이다. 이와 같이 레코드 타입의 필드를 가진 레코드가 중첩 레코드이다.

'DB > ORACLE' 카테고리의 다른 글

31.[오라클]컬렉션 메소드  (0) 2025.01.25
30.[오라클]컬렉션  (0) 2024.04.13
28.[오라클]커서  (0) 2024.02.24
27.[오라클]트랜잭션  (0) 2024.02.24
26.[오라클]예외처리  (0) 2024.02.23