DATABASE/SQL, PL-SQL

앵커(%)를 사용한 데이터 타입 지정

devstep88 2021. 1. 19. 22:43

변수나 컬럼, 테이블, 커서 등의 기존 선언을 참조하여 데이터 타입을 지정하는 방법이다.

이 방법을 사용하면 식별자의 선언문이 간단해지고, 차후에 참조되는 타입이 변경되더라도 이를 참조하는 쪽은 소스 코드를 수정하지 않아도 된다는 장점이 있다.

 

%TYPE

다른 변수 또는 컬럼의 데이터 타입과 동일한 타입을 지정할 때 사용된다.

DECLARE
	v_ename		emp.ename%TYPE;		--컬럼의 타입을 참조하여 데이터 타입을 지정(칼럼 앵커)
    v_ename2	v_ename%TYPE;		--위의 변수 v_ename의 타입을 참조하여 데이터 타입을 지정(변수 앵커)
BEGIN
	SELECT ename INTO v_ename
    	FROM EMP
    WHERE ROWNUM = 1;
    v_ename2 := v_ename;
END;

 

%ROWTYPE

테이블 또는 커서의 로우(Row)와 동일한 구조를 가지는 레코드를 지정

%ROWTYPE은 로우 앵커라고도 불린다. %ROWTYPE은 참조되는 테이블 또는 커서와 동일한 칼럼명과 데이터 타입을 가지는 레코드를 선언한다.

테이블%ROWTYPE으로 선언된 레코드 변수는 SELECT * FROM 테이블을 사용하여 TABLE의 전체 칼럼을 FETCH하거나 커서의 결과를 저장할 레코드를 선언할 때 유용하게 사용된다.

 

DECLARE
	v_emprec emp%ROWTYPE;	--테이블을 참조하여 선언(로우 앵커), e_emprec는 RECORD가 됨
    v_emprec2 v_emprec%TYPE -- RECORD 변수 v_emprec를 참조하여 선언(변수 앵커)
    
    CURSOR emp_cursor(a_empno NUMBER) IS
    	SELECT empno, ename, hiredate
        	FROM emp
         WHERE empno = a_empno;
        v_emprec3 emp_cursor%ROWTYPE;	-- 커서 선언을 참조하여 레코드 변수 선언
BEGIN
	SELECT * INTO v_emprec
    	FROM EMP
    WHERE ROWNUM = 1;
    v_emprec2 := v_emprec;
    
    OPEN emp_cursor(7788);
    FETCH emp_cursor INTO v_emprec3;
    CLOSE emp_cursor;
END;

 

스칼라 데이터 타입과 컴포지트 데이터 타입

단 하나의 값만을 저장할 수 있는 데이터 타입을 스칼라(Scalar) 데이터 타입이라고 하고, 두 개 이상의 값을 저장할 수 있는 데이터 타입을 컴포지트(Composite) 데이터 타입이라고 한다.

항목 스칼라 데이터 타입 컴포지트 데이터 타입
특징 - 오직 하나의 값만을 가진다
- 다른 내부적인 구성항목(자료구조)을 가지지 않는다
- 내부적으로 여러 개의 구성항목을 가질 수 있다
- 내부 구성 항목은 스칼라 데이터 타입이거나 다른 컴포지트 데이터 타입일 수 있다.
VARCHAR2
NUMBER
DATE
BOOLEAN
Associative Array
VARRAY
Nested Table
Record