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 --------- -------------- -------------- ------------------------
|
이제 brand%ROWTYPE으로 선언된 변수들는 위와 같은 1개 ROW 크기의 구조로 메모리에 잡히게 된다.
변수를 하나 선언해 보자.
brand_record brand%ROWTYPE;
DECLARE
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 변수에 우선 LG의 내용을 그대로 담았다가 전화번호와 주소만 그대로 갖다 썼다.
추가 된 것을 확인.
2. %TYPE
- 특정 테이블의 한개 컬럼과 동일한 데이터 타입으로 변수가 생성된다.
예를 들면,
v_brand_name BRAND.BRAND_NAME%TYPE := 'KTFT'
- brand table의 brand_name 컬럼과 같은 타입으로 지정
- brand table의 brand_name 이 변경되면 같이 변경된다.
개념은 동일함.
[ 출처 ] http://blog.naver.com/tangamjaelt?Redirect=Log&logNo=36966369
'DataBase > PLSql' 카테고리의 다른 글
[PL/Sql] PL/Sql 커서(cursor) FOR UPDATE 절 (0) | 2012.08.13 |
---|---|
[PL/Sql] PL/Sql 커서(cursor) (0) | 2012.08.13 |
[PL/Sql] PL/Sql 패키지 (Package) (0) | 2012.08.13 |
[PL/Sql] PL/Sql 프로시저? (0) | 2012.08.13 |
[PL/Sql] PL/Sql 변환함수 (0) | 2012.08.13 |