###################################################################################################

#   source site : blog.naver.com/tangamjaelt

#   master : 강용운

#   email : tangamjaelt@korea.com

#   last release : 2007.08.20

###################################################################################################

 

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 이 변경되면 같이 변경된다.

 

개념은 동일함.

 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)