본문으로 바로가기

[Oracle] PL/SQL 기초8 - 레코드(RECORD)

category 4. Database/4_3 Oracle 기본 2020. 7. 25. 18:40
반응형

[Oracle] PL/SQL 기초8 - 레코드(RECORD)

 

안녕하세요. 갓대희 입니다. 이번 포스팅은 [ [Oracle] PL/SQL 기초 - 레코드(Record) ] 입니다. : ) 

혹시 이해가 안되는 내용이 많을 수 있으니, 하단의 예제부터 보는것도 추천 한다.

 

0.Oracle Record

▶ 0. 레코드(Record)란?

 - PL/SQL에서 제공하는 테이블 형태의 데이터 타입 이다.

 - 여러개의 데이터 타입을 갖는 변수들의 집합.(일반 빌트인 타입으로 변수 선언시 1개의 값만 가질 수 있다.) 
 - 논리적 단위로서 필드 집합을 처리할 수 있도록 해준다.
 - 스칼라(%type/%rowtype), RECORD, 또는 PL/SQL TABLE datatype 중 하나 이상의 요소로 구성
 - PL/SQL 테이블과 다르게 개별 필드의 이름을 부여할 수 있고, 선언시 초기화가 가능하다. 하지만 테이블과 다르게 레코드가 가질 수 있는 로우의 수는 단 한개 뿐이다.

 - 이 레코드 변수를 통해 테이블에 INSERT, UPDATE도 가능하다.

 

▶ 1. 문법

TYPE 레코드이름 IS RECORD (

   필드1 데이터타입1 [[NOT NULL] := DEFAULT],

   필드2 데이터타입2 [[NOT NULL] := DEFAULT],

   ...

);

 

레코드이름 테이블명%ROWTYPE;
레코드이름 커서명%ROWTYPE;

 

1.Oracle Table of RECORD

▶ 0. Table of RECORD

 - 테이블 타입 선언 
 - 한개의 변수로 여러개의 데이터 타입을 갖는 변수들의 집합

 

▶ 1. 문법

 - 특정 테이블의 모든 컬럼을 받아 레코드 선언시 %ROWTYPE을 사용 한다.

TYPE 변수명 IS TABLE OF 테이블명%ROWTYPE INDEX BY BINARY_INTEGER;

 

2. 커서형 레코드

▶ 0. 커서형 레코드

 - 커서를 레코드 변수로 받을 수 있다.

 

▶ 1. 문법

 - 커서이름%ROWTYPE

 

ex) 레코드, 테이블 타입 레코드, 커서형 레코드 예제

DECLARE
TYPE RECORD1 IS RECORD (
	DEPTNO   NUMBER
	, DNAME  VARCHAR2(14)
	, LOC 	 VARCHAR2(13)
	);

REC1 RECORD1; -- 0. 레코드 선언
REC2 DEPT%ROWTYPE; -- 1. 테이블형 레코드 선언

CURSOR C1 IS
	SELECT  DEPTNO, DNAME, LOC
	FROM	DEPT;

REC3 C1%ROWTYPE;    -- 2.커서형 레코드 선언
BEGIN
	OPEN C1;
	LOOP
        FETCH C1 INTO REC3;
        EXIT WHEN C1%NOTFOUND;
		dbms_output.put_line('DEPTNO : ' || REC3.DEPTNO || ', DNAME : ' || REC3.DNAME);
	END LOOP;
	
    dbms_output.put_line('************************************');
    -- 0. 레코드 사용
    REC1.DEPTNO   	:= 50;
	REC1.DNAME 		:= 'RESEARCH2';
	REC1.LOC     	:= 'LA';
    
    -- 1. 테이블형 레코드 사용
    REC2.DEPTNO   	:= 60;
	REC2.DNAME 		:= 'RESEARCH3';
	REC2.LOC     	:= 'TEXAS';
    
	INSERT INTO DEPT VALUES REC1; -- 0. 레코드 사용
    
    INSERT INTO DEPT VALUES REC2; -- 1. 테이블형 레코드 사용
    
    FOR C2 IN (
      SELECT  DEPTNO, DNAME, LOC
      FROM	DEPT
    )
    LOOP
    	dbms_output.put_line('DEPTNO : ' || C2.DEPTNO || ', DNAME : ' || C2.DNAME || ', LOC : ' || C2.LOC);
    END LOOP;
    
	COMMIT;
EXCEPTION
	WHEN OTHERS THEN
	ROLLBACK;
END;

 

반응형

댓글을 달아 주세요