이번글에서는 CLOB데이터타입을 저장하는 방법에 대해 작성해 보았습니다.
두 가지 CASE로 나눠서 정리하려고 합니다.
1. 4000Byte 이하의 CLOB 데이터 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
DECLARE
l_clob CLOB;
BEGIN
-- CLOB 열 초기화
l_clob_data := EMPTY_CLOB();
-- 데이터 삽입, CLOB COLUMN은 처음에 빈값으로 INSERT 한다.
INSERT INTO TABLE_NAME (normal_column, clob_column)
VALUES (l_normal_column_value, l_clob_data)
RETURNING clob_column INTO l_clob_data;
-- 데이터 작성
DBMS_LOB.WRITEAPPEND(l_clob_data, LENGTH('Your CLOB Data'), 'Your CLOB Data');
-- 커밋
COMMIT;
-- 결과 출력
DBMS_OUTPUT.PUT_LINE('CLOB 데이터가 성공적으로 삽입되었습니다.');
END;
|
cs |
INSERT 할 때는 EMPTY_CLOB() 함수로 초기화 한 값을 넣어주고
RETURNING INTO 로 CLOB컬럼을 추출한 뒤 DBMS_LOB패키지를 이용해 데이터를 작성합니다.
위 쿼리에서 녹색 부분을 잘 보시고 필요에 맞게 수정해서 사용하면 됩니다.
4000Byte 이하는 크게 어려움 없이 쉽게 저장할 수 있습니다.
문제는 이 밑에 설명할 4000Byte 이상의 CLOB데이터를 저장할 때입니다.
오라클에서 CLOB열은 일반적으로 4GB 이상의 대용량 텍스트 데이터를 저장할 수 있지만
단일 INSERT문으로는 4000Byte를 초과하는 데이터를 한 번에 저장할 수 없습니다.
2. 4000Byte 이상의 CLOB데이터 저장
대용량 CLOB데이터를 저장하는 방법은 'DBMS_LOB.APPEND' 서브 프로그램을 사용하여
단계적으로 삽입하는 것입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
DECLARE
l_clob_data CLOB; --대용량 text를 잘라서 붙이 clob변수
l_string VARCHAR2(32767); -- 임시 문자열 변수
l_offset NUMBER := 1; -- 문자를 자를때 사용할 cursor
l_chunk_size NUMBER := 4000; -- 문자를 자를 길이
BEGIN
-- CLOB 열 초기화
l_clob_data := EMPTY_CLOB();
INSERT INTO TABLE_NAME (normal_column, clob_column)
VALUES (l_normal_column_value, l_clob_data)
RETURNING clob_column INTO l_clob_data;
-- 대용량 문자열
l_string := 'Your large text here...'; -- 삽입할 대용량 문자열 입력
-- 대용량 문자열을 조각으로 나누어 CLOB에 추가
WHILE l_offset <= LENGTH(l_string) LOOP
DBMS_LOB.WRITEAPPEND(l_clob_data, SUBSTR(l_string, l_offset, l_chunk_size));
l_offset := l_offset + l_chunk_size;
END LOOP;
-- 커밋
COMMIT;
-- 결과 출력
DBMS_OUTPUT.PUT_LINE('CLOB 데이터가 성공적으로 삽입되었습니다.');
END;
|
cs |
INSERT 부분은 위에 쿼리와 동일하지만
밑에 CLOB데이터를 작성하는 부분이 단계적으로 바뀌었습니다.
변수에 문자열을 자를 때 사용할 offset과 size를 선언하고 SUBSTR을 이용해
1 ~ 4000, 4001 ~ 8000 이렇게 일정 부분씩 잘라서 l_clob_data에 작성해 주면 됩니다.
위 예제를 이용해 Object를 만들어두고
업무에 이용하면 유용할 것 같습니다.
-끝-
이번글에서는 CLOB데이터타입을 저장하는 방법에 대해 작성해 보았습니다.
두 가지 CASE로 나눠서 정리하려고 합니다.
1. 4000Byte 이하의 CLOB 데이터 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
DECLARE
l_clob CLOB;
BEGIN
-- CLOB 열 초기화
l_clob_data := EMPTY_CLOB();
-- 데이터 삽입, CLOB COLUMN은 처음에 빈값으로 INSERT 한다.
INSERT INTO TABLE_NAME (normal_column, clob_column)
VALUES (l_normal_column_value, l_clob_data)
RETURNING clob_column INTO l_clob_data;
-- 데이터 작성
DBMS_LOB.WRITEAPPEND(l_clob_data, LENGTH('Your CLOB Data'), 'Your CLOB Data');
-- 커밋
COMMIT;
-- 결과 출력
DBMS_OUTPUT.PUT_LINE('CLOB 데이터가 성공적으로 삽입되었습니다.');
END;
|
cs |
INSERT 할 때는 EMPTY_CLOB() 함수로 초기화 한 값을 넣어주고
RETURNING INTO 로 CLOB컬럼을 추출한 뒤 DBMS_LOB패키지를 이용해 데이터를 작성합니다.
위 쿼리에서 녹색 부분을 잘 보시고 필요에 맞게 수정해서 사용하면 됩니다.
4000Byte 이하는 크게 어려움 없이 쉽게 저장할 수 있습니다.
문제는 이 밑에 설명할 4000Byte 이상의 CLOB데이터를 저장할 때입니다.
오라클에서 CLOB열은 일반적으로 4GB 이상의 대용량 텍스트 데이터를 저장할 수 있지만
단일 INSERT문으로는 4000Byte를 초과하는 데이터를 한 번에 저장할 수 없습니다.
2. 4000Byte 이상의 CLOB데이터 저장
대용량 CLOB데이터를 저장하는 방법은 'DBMS_LOB.APPEND' 서브 프로그램을 사용하여
단계적으로 삽입하는 것입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
DECLARE
l_clob_data CLOB; --대용량 text를 잘라서 붙이 clob변수
l_string VARCHAR2(32767); -- 임시 문자열 변수
l_offset NUMBER := 1; -- 문자를 자를때 사용할 cursor
l_chunk_size NUMBER := 4000; -- 문자를 자를 길이
BEGIN
-- CLOB 열 초기화
l_clob_data := EMPTY_CLOB();
INSERT INTO TABLE_NAME (normal_column, clob_column)
VALUES (l_normal_column_value, l_clob_data)
RETURNING clob_column INTO l_clob_data;
-- 대용량 문자열
l_string := 'Your large text here...'; -- 삽입할 대용량 문자열 입력
-- 대용량 문자열을 조각으로 나누어 CLOB에 추가
WHILE l_offset <= LENGTH(l_string) LOOP
DBMS_LOB.WRITEAPPEND(l_clob_data, SUBSTR(l_string, l_offset, l_chunk_size));
l_offset := l_offset + l_chunk_size;
END LOOP;
-- 커밋
COMMIT;
-- 결과 출력
DBMS_OUTPUT.PUT_LINE('CLOB 데이터가 성공적으로 삽입되었습니다.');
END;
|
cs |
INSERT 부분은 위에 쿼리와 동일하지만
밑에 CLOB데이터를 작성하는 부분이 단계적으로 바뀌었습니다.
변수에 문자열을 자를 때 사용할 offset과 size를 선언하고 SUBSTR을 이용해
1 ~ 4000, 4001 ~ 8000 이렇게 일정 부분씩 잘라서 l_clob_data에 작성해 주면 됩니다.
위 예제를 이용해 Object를 만들어두고
업무에 이용하면 유용할 것 같습니다.
-끝-