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

#   source site : blog.naver.com/tangamjaelt

#   master : 강용운

#   email : tangamjaelt@korea.com

#   last release : 2007.08.30

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

 

 

1. LOB

 

- LOB은 TEXT, 그래픽, 이미지, 비디오, 사운드 등 구조화되지 않은 대형 데이터를 저장하는데 사용한다.

- 일반적으로 테이블에 저장되는 구조화된 데이터들은 크기가 작지만, 멀티미디어 데이터는 크기가 크다.

- 크기가 큰 데이터는 DB에 저장하기 힘들기 때문에 OS상 존재하는 파일을 데이터베이스가 접근하게 된다.

- LONG, LONG RAW 데이터 유형은 예전에 사용던 것이고, 현재는 대부분 LOB 데이터 유형을 사용한다.

- TO_LOB 함수를 이용하여 LONG 및 LONG RAW 를 LOB 으로 변경할 수 있다.

 

종류

   - CLOB : 문자 대형 객체 (Character). Oracle Server는 CLOB과 VARCHAR2 사이에 암시적 변환을 수행한다.

   - BLOB : 이진 대형 객체 (Binary). 이미지, 동영상, MP3 등... 

   - NCLOB : 내셔널 문자 대형 객체 (National). 오라클에서 정의되는 National Character Set을 따르는 문자.

   - BFILE : OS에 저장되는 이진 파일의 이름과 위치를 저장. 읽기 전용 모드로만 액세스 가능.

 

데이터베이스 내부, 외부에 따라

   - 내부 : BLOB, CLOB, NCLOB - Table에 LOB 형식의 컬럼을 생성하고 이곳에 데이터의 실제위치를 가리키는 Locator(위치자) 저장.

   - 외부 : BFILE

 

특징

- 하나의 테이블에 여러 개의 LOB 열(column) 가능

- 최고 4GB까지 저장

- SELECT로 위치자 반환

- 순서대로 또는 순서없이 데이터 저장

- 임의적 데이터 액세스

 

LOB 구성

- LOB 값 : 저장될 실제 객체를 구성하는 데이터

- LOB 위치자 : 데이터베이스에 저장된 LOB값의 위치에 대한 포인터

- LOB열에는 데이터가 없고 LOB 위치자만 들어있다.

 

 

2. 내부 LOB

 

- LOB값은 데이터베이스에 저장된다.

- 사용자 정의 유형 속성, 테이블의 열, 바인드 변수, 호스트 변수, PL/SQL변수, 파라미터 또는 결과

- 동시성 방식, 리두 로그 및 복구 방식, 커밋 또는 롤백 트랜잭션 사용 가능

- BLOB 데이터 유형은 Oracle Server 내에서 비트 스트림으로 해석된다.

- CLOB 데이터 유형은 단일 바이트 문자 스트림으로 해석된다.

- NCLOB 데이터 유형은 데이터베이스 national character set 의 바이트 길이에 따라 멀티바이트 문자 스트림으로 해석된다.

 

내부 LOB 관리

- LOB 데이터 유형을 포함하는 테이블을 생성한 후 이를 채운다.

- 프로그램에서 LOB 위치자를 선언하고 초기화한다.

- SELECT FOR UPDATE를 사용하여 LOB이 포함된 행을 잠그고 해당 행 값을 LOB 위치자에 넣는다.

- LOB 위치자를 LOB값에 대한 참조로 사용하여 DBMS_LOB 패키지 프로시저, OCI호출, OLE용 오라클 객체, 오라클 선행 컴파일러 또는 JDBC를 통해 LOB을 조작한다.

- SQL을 통해서도 LOB 관리 가능(일부)

- COMMIT을 통해 변경사항 적용.

 

 

3. CLOB

 

lob_test1.sql

CREATE TABLE CAR (
        id      NUMBER(6) PRIMARY KEY NOT NULL,
        name    VARCHAR2(20),
        price   NUMBER(10),
        review  CLOB)
/

 

INSERT INTO CAR VALUES (100, 'SM7', 25000000, '삼성에서 나온 SM7을 타보니 정말 편안했다.')
/
INSERT INTO CAR VALUES (200, 'PORTER', 13000000, '역시 1톤트럭의 대표자!!')
/
INSERT INTO CAR VALUES (300, 'VERNA', 9000000, '싸고 좋은 거 같아용~^^*')
/
INSERT INTO CAR VALUES (400, 'SANTAFE', 33000000, EMPTY_CLOB())
/

 

- 테이블 생성시 CLOB 타입 컬럼을 선언하고, 데이터 입력.

- 따로 SIZE는 지정하지 않는다.

- EMPTY_CLOB() 함수는 위치자(Locator)를 아무 것도 없는 데이터로 초기화시킨다.

 

 

 

- BLOB 의 경우엔 SQL*Plus 에서 볼 수 없다는 에러가 발생하였다.

SP-0678: Column or attribute type can not be displayed by SQL*Plus

 

 

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

#   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)