먼저 Long 과 Lob는 크기가 큰 오브젝트를 저장하기 위한 데이터 유형들입니다.
이것들의 특징을 먼저 살펴보죠~
* Long
1. Table에 컬럼 하나만 생성할 수 있습니다 .
2. Long 데이터 유형은 2GB의 문자열 데이터를 저장할 수 있습니다.
3. SELECT 결과로 데이터를 리턴합니다.
4. 데이터를 직접 저장합니다.
5. 오브젝트 유형을 지원하지 않습니다.
* Lob
1. Table에 여러개의 컬럼을 생성할 수 있습니다.
2. Lob 데이터 유형은 4GB의 문자열 데이터를 저장할 수 있습니다.
3. SELECT 결과로 위치를 리턴합니다.
4. 데이터를 직접 저장 또는 간접 저장합니다.
5. 오브젝트 유형을 지원합니다.
LONG 과 LOB의 차이점이 이렇게 보여집니다.
Lob에도 이렇게 유형이 나누어 집니다
BLob --이진 데이터를 저장합니다.
CLob -- 기본서버 문자 집합을 기준으로 1 BYTE의 데이타 베이스 문자 집합 데이터를 저장합니다.
NCLob --데이터 베이스의 국가 표준 문자 집합을 기준으로 하는 유니코드 문자데이터를 저장합니다.
이 아래의 코드는 BLOB, CLOB 및 NCLOB 열을 포함하는 테이블을 만듭니다
OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = "CREATE TABLE MyBlobTable (Id NUMBER, BlobCol BLOB,
ClobCol CLOB, NclobCol NCLOB)";
cmd.ExecuteNonQuery();
다음 코드는 사용자가 선택한 파일을 BLOB 열에 삽입하고 일부 테스트 텍스트를 CLOB 및 NCLOB 열에 삽입합니다.
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
FileStream fs = new FileStream(ofd.FileName, FileMode.Open,
FileAccess.Read);
byte[] blob = new byte[fs.Length];
fs.Read(blob, 0, blob.Length);
fs.Close();
OracleDataAdapter da = new OracleDataAdapter("
SELECT Id, BlobCol, ClobCol, NclobCol FROM MyBlobTable",
CONNECTSTRING);
DataTable dt = new DataTable();
// 스키마를 가져옵니다.
da.FillSchema(dt, SchemaType.Source);
OracleCommandBuilder cb = new OracleCommandBuilder(da);
int id = 1;
string clob = "test CLOB text";
string nclob = "test NCLOB text";
// 데이터가 들어 있는 행을 만듭니다.
DataRow row = dt.NewRow();
row["Id"] = id;
row["BlobCol"] = blob;
row["ClobCol"] = clob;
row["NclobCol"] = nclob;
dt.Rows.Add(row);
// 테이블을 업데이트합니다.
da.Update(dt);
}
다음 코드는 LOB 데이터를 검색합니다.
int id = 1;
OracleLob blob = null;
String clob = "";
String nclob = "";
OracleConnection conn = new OracleConnection(CONNECTSTRING);
OracleCommand cmd = new OracleCommand(
"SELECT BlobCol, ClobCol, NclobCol FROM MyBlobTable WHERE Id = " + id,
conn);
conn.Open();
OracleDataReader dr = cmd.ExecuteReader();
if(dr.Read())
{
if(!dr.IsDBNull(0))
blob = dr.GetOracleLob(0);
MemoryStream ms = new MemoryStream((byte[])blob.Value);
// 스트림을 사용하여 작업을 수행합니다.
ms.Close();
if(!dr.IsDBNull(1))
clob = dr.GetOracleLob(1).Value.ToString();
if(!dr.IsDBNull(2))
nclob = dr.GetOracleLob(2).Value.ToString();
Console.WriteLine("BLOB length = " + blob.Length + "; " +
clob.ToString() + "; " + nclob.ToString());
}
dr.Close();
conn.Close();
콘솔 출력은 다음과 같습니다.
BLOB length = 1171; test CLOB text; test NCLOB text
LONG 데이터 타입은 , 하위버젼에 대한 호환성을 위해 존재하며, 역활은 CLOB / NCLOB 과 유사하게 문자 데이터를 저장합니다.
차이점은 , 별도의 세그먼트에 데이터가 존재하는 것이 아니라 테이블 내 다른 데이터와 함께 저장된다는 점입니다.
그리고 Oracle 에서는 LONG 타입이 하위 버젼을 지원하기 때문에 LOB 타입을 권장한다는 것입니다.
PURPOSE
-------
이 문서는 LOB 데이터 타입과 LONG이나 LONG Raw 데이터 타입의 차이점 및
LOB 사용에 따라 발생하는 제약 사항을 기술하는 데 목적이 있다.
Explanation
-----------
LOB (Large Object)는 LONG이나, LONG RAW 데이터 타입과 유사하지만, 일부 차이점이 존재한다.
1. 테이블의 한 ROW에 여러 LOB 컬럼이 있을 수 있는 반면, LONG 또는 LONG RAW 컬럼은
한 ROW에 하나 밖에 사용될 수 없다.
2. LOB는 사용자 정의 데이터 타입 (user-defined datatype)의 속성 (attribute) 으로
사용될 수 있는 반면, LONG이나 LONG RAW는 속성으로 사용될 수 없다.
3. LONG 또는 LONG RAW는 값 전체가 테이블 내에 저장이 되는 반면, LOB는 테이블 컬럼
내에 LOB locator만 저장이된다. BLOB과 CLOB (내부 LOB) 데이터는 별도의 테이블스페이스에
저장시킬 수 있으며, BFILE (외부 LOB) 데이터는 데이터베이스 외부의 별도 파일로 존재한다.
따라서 LOB 컬럼을 액세스할 경우에는, locator 값만 return되는 반면, LONG이나
LONG RAW 컬럼을 액세스할 경우에는, 전체 값이 return된다.
4. LOB 데이터는 4GB까지 저장이 가능하며, BFILE 컬럼이 가리키는 파일 크기는 4GB 이내에서
OS에서 지원하는 최대 크기까지 가능하다. 액세스 가능한 범위는 1부터 (232-1) 까지이다.
한편 LONG이나 LONG RAW 데이터 타입에서는 2GB 까지만 지원이 가능하다.
5. 데이터에 대한 랜덤 액세스 기능 또는 데이터 조작을 할 경우 LOB를 사용하는 것이
LONG 또는 LONG RAW를 사용하는 것에 비해 훨씬 많은 기능을 사용할 수 있다.
6. LOB는 랜덤 액세스가 가능한 반면, LONG 타입에 저장된 데이터는 처음부터 원하는
지점까지 순차적으로 읽어 처리하여야 한다.
7. LOB 데이터에 대한 replication을 local 또는 remote에서 수행할 수 있는 반면,
LONG / LONG RAW 컬럼 데이터는 replication이 되지 않는다.
8. LONG 컬럼의 데이터는 TO_LOB()라는 함수를 사용하여 LOB로 변환 가능하지만,
LOB를 LONG / LONG RAW로 변환 하는 기능은 제공되지 않는다.
◈ LOB 데이터 타입의 제약 사항
1. LOB는 클러스터 테이블에서는 사용할 수 없으며, 따라서 클러스터 키로도 사용할 수 없다.
2. LOB 컬럼은 GROUP BY, ORDER BY, SELECT DISTINCT 등에 사용할 수 없으며
JOIN 에도 사용할 수 없다.
그러나 LOB 컬럼을 사용하는 테이블에 대한
UNION ALL은 지원이 된다. UNION MINUS나 SELECT DISTINCT는 OBJECT TYPE의
MAP이나 ORDER 함수가 정의된 경우 사용할 수 있다.
3. LOB 컬럼은 ANALYZE ... COMPUTE/ESTIMATE STATISTICS 명령 사용 시에도
Analyze 되지 않는다.
4. LOB는 파티션된 IOT (Index Organized Table)에는 사용할 수 없다. 그러나
파티션 되어 있지 않은 IOT에는 사용할 수 있다.
5. LOB는 VARRAY에는 사용할 수 없다.
6. NCLOB은 OBJECT TYPE의 속성(attribute)으로 사용될 수 없으나, 메소드 정의를 하는 데는
NCLOB 파라미터를 사용할 수 있다.
Reference Documents
-------------------
Oracle8i Application Developer's Guide
Note:107441.1
Technical Bulletins