LOB 활용법 (PL/SQL)
Document URL : http://www.dator.co.kr/381212
Oracle DB |
Posted on December 18th, 2012 at 01:10 by 밀오
| 조회수 : 54724
참조1: Oracle® Database Application Developer's Guide - Large Objects 10g Release 2 (10.2)
http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/toc.htm
참조2: BLOB 타입을 CLOB 타입으로 변경: http://www.dator.co.kr/data/textyle/96598
대상 : Oracle PL/SQL 개발자
이 글에서는 PL/SQL Temporary LOB 이용법을 주요 주제로 다룹니다.
LOB란?
LOB는 Large OBject의 약자로,
오라클에서 일반적인 data type으로는 담을 수 없는 대량의 데이터를 저장하기 위해 고안된 타입입니다.
또한, 기존의 기술인, LONG 과 LONG RAW를 대체하는 역할을 합니다.
(오라클에서 LONG은 하위버전 호환을 위해서만 제공하고 있으며, 사용을 권장하지 않고 있습니다.)
Pro*C/C++, Pro*COBOL, VB(OO4O) 에서는, 최대 (4Giga-1)byte 까지 저장할 수 있고,
Java(JDBC), PL/SQL(DBMS_LOB), C(OCI) 에서는, 최대 8~128 TB 까지 저장할 수 있습니다.
아래는 LOB와 LONG RAW를 비교한 표입니다.
Table 4-1 LOBs Vs. LONG RAW
LOB들은 사용자 지정 타입의 속성으로 사용할 수 있다.
LONG 이나
LONG
RAW 에 접근할 때엔, 전체 값을 통째로 받아온다.
LONG 과
LONG
RAW의 최대 크기는 2GB 로 제한된다.
원문: http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/adlob_tables.htm#sthref152
LOB 이해하기
PL/SQL에서의 LOB는 간단하게 말하면, 프로그래밍 언어의 포인터(참조변수) 와 같습니다.
테이블이나, 외부 파일, 임시저장소 등에 LOB를 저장할 영역을 할당해 놓고, 해당 영역을 가리키도록 구성되어 있습니다.
오라클에서는 이렇게 가리키는 녀석을, LOB Locator라고 부르고 실제 저장된 LOB 값을, LOB Value라고 부르고 있습니다.
때문에, 일반 변수타입과 달리, 타입 하나에 2가지 객체가 포함되어 있으며, 이로 인해 독특한 특성을 지니고 있습니다.
LOB 저장소 기준 분류
LOB는 실제 타입은 아니고 여러 타입을 묶어서 통칭하는 분류어입니다.
LOB value가 저장되는 위치에 따라서 각기 다른 특징을 가지는데, 다음과 같이 분류됩니다. 1. 외부 (External LOB) - 현재로선 파일(BFILE)이 유일한 External LOB Type 입니다. - 값이 DB 외부에 저장되며, Read-only입니다. - 복사시 Lob locator만 복사됩니다. 테이블에 insert 해도 실제 값이 복사되지 않고 locator만 복사됩니다. - Lob locator는 여러 곳에 복사될 수 있습니다.
2. 내부 (Internal LOB) 2-1. 테이블 (Persistent) - 값이 테이블에 저장됩니다. 2-2. 임시저장소(Temporary) - 값이 변수에 저장됩니다. - Read-Write 둘다 가능합니다 - Lob locator와 Lob Value가 같이 붙어다니며, 복제시 인스턴스가 새로 생성됩니다. 즉, 같은 대상을 여러개의 LOB 변수가 가리키지 않으며, 수정해도 원본이 변경되지 않습니다. - 함수 인자에 NOCOPY 옵션을 주어서, 복사에 수행되는 부담을 덜 수 있습니다.
LOB 타입 기준 분류
BFILE - External LOB를 불러올 때 사용하는 타입입니다. 읽기 전용 타입으로, Lob Locator만 복사됩니다. BLOB - Binary data 저장용입니다. RAW type과 쉽게 호환되나, CLOB와의 상호변환은 character set 문제를 감안해야 합니다. CLOB - Text data 저장용입니다. NCLOB - CLOB의 유니코드 지원버전입니다. national character set과 관계없이 UCS-2 호환형식으로 저장됩니다. LOB 변수 생성 및 값 대입
1. 외부 LOB(BFILE) - 외부 파일을 읽어와서 locator를 지정하는 방식입니다. BFILENAME 함수를 이용해서 locator를 지정할 수 있습니다.
단 파일명과 디렉토리를 지정해 주어야 하며, CREATE DIRECTORY로 DIRECTORY 가 미리 지정되어 있어야 합니다.
관련 예제) 하단 Ex1
2. 내부 LOB 2-1. 테이블(Persistent) - Select나 DML 문을 이용해서 locator를 지정할 수 있습니다
관련 예제) 하단 Ex2
2-2. 임시(Temporary) - DBMS_LOB.CREATETEMPORARY(...) 를 이용해서 locator를 지정할 수 있습니다. - 또는 다른 LOB를 복사해서 생성하는 경우도 있습니다. - 둘 중 한가지가 아니라면, invalid locator 어쩌구 하는 에러가 발생합니다.
관련 예제) 하단 Ex1 LOB 타입 간 변환
1. BFILE -> BLOB, CLOB DBMS_LOB 패키지의 LOADBLOBFROMFILE 을 이용하면 BFILE -> BLOB 로 변환할 수 있고, LOADCLOBFROMFILE 을 이용하면 BFILE -> CLOB 로 변환할 수 있습니다.
UTL_FILE 등의 파일 지원 패키지를 이용하면, file로 저장도 가능합니다. (LOB 와는 거리가 멀어져서 이글에서는 다루지 않겠습니다.)
관련 예제) 하단 Ex1