■ Data Skill ■/PL-SQL

PL/SQL (12) - 데이터타입 (%ROWTYPE 과 %TYPE)

한길(One Way) 2023. 3. 17.

PL/SQL에서는 일반적으로 BOOLEAN, CHAR, VARCHAR2, DATE, NUMBER 와 같은 데이터 타입을 사용하지만, 추가적으로 특정 TABLE이나 특정 COMLUMN과 같은 형식의 데이터타입을 사용할 수도 있다.

 

- 특정 TABLE의 ROW와 동일한 테이터타입 : table%ROWTYPE

- 특정 COLUMN과 동일한 데이터타입 : table.comlumn%TYPE

 

 

1. %ROWTYPE

- 프로그래밍에서 변수란 데이터를 담는 임시 그릇이다. 데이터타입을 지정한다는 것은 그릇의 크기를 메모리에 지정해주는 작업이다.

- 같은 논리로 PL/SQL에서 변수를 선언할 때 변수를 선언하고 데이터타입을 특정 테이블의 1개 ROW와 동일한 크기로 지정해서 그 곳에 값을 저장하는 것이다. C언어의 구조체와 비슷하다고 생각하면 되겠다.

 

예를 들어보자.

아래와 같이 brand 라는 테이블이 존재한다. (4개컬럼 : BID, BRAND_NAME, BRAND_TEL, BRAND_ADDR)

 

여기에서 1개 ROW만 뗘다가 구조를 살펴보자

BID BRAND_NAME BRAND_TEL BRAND_ADDR

--------- -------------- -------------- ------------------------

B1 SAMSUNG 031-333-3333 경기 수원시 권선구

이제 brand%ROWTYPE으로 선언된 변수들는 위와 같은 1개 ROW 크기의 구조로 메모리에 잡히게 된다.

변수를 하나 선언해 보자.

DECLARE
brand_record brand%ROWTYPE;

 

brand 1개 ROWTYPE 형 brand_record 변수를 선언했다.

brand_record 의 레코드의 구조는 brand 테이블의 각 필드와 동일하게 구성되므로, 아래와 같은 구조로 이루어지게 된다.

 

brand_record

bid
brand_name
brand_tel
brand_addr

데이터를 담을 수 있는 공간이 한번에 4개가 생겼다.

 

이들 공간에 변수에 값을 넣는 작업은,

 

brand_record.bid := "100"

brand_record.brand_name := "NOKIA" 이런식으로 변수에 값 할당이 가능하다.

 

brand_record라는 변수는 생성된 메모리 공간의 첫주소를 나타내는 포인터와 같다.

 

 

보충설명

- 데이터베이스 테이블 또는 뷰의 열 collection에 따라 레코드를 선언하려면 %ROWTYPE 속성을 사용한다.

- 레코드 필드의 이름과 데이터 유형은 테이블 또는 뷰의 열에서 가져온다.

- 데이터베이스의 테이블 구조를 모르면 %ROWTYPE 속성을 사용한다.

- 테이블 유형이 변경되면 동적으로 자동 변경된다.

- 테이블에서 행 전체를 검색할 때 특히 유용하다.

 

장점

- 기본 데이터베이스 열의 수나 데이터 유형을 몰라도 사용할 수 있다.

- 실행 중에 기본 데이터베이스 열의 수나 데이터 유형을 변경할 수 있다.

- SELECT * 문을 사용하여 행(row)을 검색할 때 유용하다.

 

예제

- brand NOKIA를 추가하는 프로시저를 만들되, LG와 전화번호와 주소가 같게 작성한다.


DECLARE
brand_new brand%ROWTYPE;

BEGIN
SELECT * INTO brand_new
FROM brand
WHERE brand_name = 'LG';

INSERT INTO brand
VALUES ('B5','NOKIA', brand_new.brand_tel, brand_new.brand_addr);

COMMIT;
END;
/

 

- brand_new 변수에 우선 LG의 내용을 그대로 담았다가 전화번호와 주소만 그대로 갖다 썼다.

추가 된 것을 확인.

 

 

2. %TYPE

 

- 특정 테이블의 한개 컬럼과 동일한 데이터 타입으로 변수가 생성된다.

 

예를 들면,

v_brand_name BRAND.BRAND_NAME%TYPE := 'KTFT'

 

- brand table의 brand_name 컬럼과 같은 타입으로 지정

- brand table의 brand_name 이 변경되면 같이 변경된다.

 

개념은 동일함.

728x90

댓글