LOB이란?
LOB:대용량 데이터를 처리하기 위해 Oracle 8i부터 대용량 데이터를 저장하기 위한 LOB(Large Object) 타입
- [표1] LOB 데이터 타입의 네 가지 종류
종류 |
파일 |
저장방식 |
BLOB |
Internal |
바이너리 데이터 저장 (최대 4G 저장) |
CLOB |
Internal |
Single-byte character data 저장(최대 4G 저장) |
NCLOB |
Internal |
Multi-byte character data 저장(최대 4G 저장) |
BFILE |
External(OS) |
OS 파일에 저장된 데이터의 포인터 저장 (최대 4G 저장) |
출처: http://www.gurubee.net/lecture/2768
BLOB 테이블은 이미지등을 저장하는 것인데 데이터베이스에 어떻게 저장이 될까?
16진수 핵사 코드로 저장된다.
만약 HELLO를 BLOB 컬럼에 저장하고 싶으면 16진수 핵사 코드로 변환하여 저장하면 된다.
변환방법은 아래와 같다.
UTL_RAW.CAST_TO_RAW /* 한글을 16진수 핵사 코드로 변환 */
UTL_RAW.CAST_TO_VARCHAR2 /* 16진수 핵사를 한글로 변환 */
새로 생성한 함수에도 위의 함수를 적용할 수 있다. 예를 들어 암복호화 할 수 있는 함수가 있다고 가정하면 아래와 같이 암호화 복호화를 적용할 수 있다.
암호화
복호화
본격적인 BLOB 데이터 저장하기
BLOB 데이터 저장할 이미지 준비
BLOB 데이터를 저장하기 위해서는 저장할 데이터인 이미지(혹은 다른것들)이 먼저 있어야 한다.
C:\RESEARCH_DATA 밑에 저장할 BLOB 데이터인 spongebob.jpg를 저장해준다.
프로시저 생성
BLOB 데이터를 생성하기 위해서는 프로시저를 만들어야 한다.
-- 테스트 테이블 생성 CREATE TABLE TBL_SAWON_BLOB (SANO NUMBER ,PHOTO BLOB ,SANAME VARCHAR2(20) ,JIK VARCHAR2(10) ,SAL NUMBER );
-- 1. 디렉토리 생성 CREATE OR REPLACE DIRECTORY DIR_BLOB AS 'C:\RESEARCH_DATA';
-- 2. 프로시저 인서트 CREATE OR REPLACE PROCEDURE PCD_BLOB_INSERT (V_SANO TBL_SAWON_BLOB.SANO%TYPE ,V_PHOTOFILENAME VARCHAR2 ,V_SANAME TBL_SAWON_BLOB.SANAME%TYPE ,V_JIK TBL_SAWON_BLOB.JIK%TYPE ,V_SAL TBL_SAWON_BLOB.SAL%TYPE ) IS V_LOCATOR BLOB; V_SOURCE_BFILE BFILE := BFILENAME('DIR_BLOB',V_PHOTOFILENAME); V_DEST_OFFSET NUMBER := 1; V_SRC_OFFSET NUMBER := 1; BEGIN INSERT INTO TBL_SAWON_BLOB VALUES(V_SANO,EMPTY_BLOB(),V_SANAME, V_JIK, V_SAL) RETURNING PHOTO INTO V_LOCATOR;
DBMS_LOB.OPEN(V_SOURCE_BFILE, DBMS_LOB.LOB_READONLY ); DBMS_LOB.LOADBLOBFROMFILE ( V_LOCATOR ,V_SOURCE_BFILE ,DBMS_LOB.GETLENGTH(V_SOURCE_BFILE) ,V_DEST_OFFSET ,V_SRC_OFFSET ); DBMS_LOB.CLOSE(V_SOURCE_BFILE); COMMIT; DBMS_OUTPUT.PUT_LINE('BLOB 타입의 테이터 저장 성공'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('BLOB 타입의 테이터 저장 실패'); END;
--프로시저 실행명령어 EXEC PCD_BLOB_INSERT(1,'spongebob.jpg','김김김','사원',99);
-- tbl_sawon_blob 테이블이 잘 생성되었는지 확인 select * from tbl_sawon_blob; |
BLOB 데이터 생성 결과
BLOB 데이터 내용 보기
저장한 spongebob.jpg의 데이터를 알고 싶은데 그냥 BLOB 형식이라고만 나온다. BLOB 형식의 데이터를 보고 싶을 때는?
BLOB과 같은 LOB 타입은 일반적인 select문으로는 볼 수 없기 때문에 오라클의 시스템함수를 사용하여 볼 수 있다.
- DBMS_LOB.SUBSTR(CLOB형 컬럼명, 자를 문자열 길이, OFFSET)
select dbms_lob.substr(photo,1000,1) from TBL_SAWON_BLOB;
BLOB 컬럼의 데이터의 총 길이
- DBMS_LOB.GETLENGTH(컬럼명)
위와 동일하게 이미 만들어진 암복호화 함수를 이용하여 이미지도 암호화 할 수 있다.
<암호화 전>
<암호화>
<복호화>
<암호화 업데이트>
<암호화 업데이트 후 결과>
<복호화 업데이트>
<복호화 업데이트 결과>
- 끝 -
'DATABASE > DB study' 카테고리의 다른 글
Database package (0) | 2020.03.16 |
---|---|
merge, insert, alter, delete (0) | 2020.03.12 |
DB Constraints (NOT NULL, UNIQUE, primary key, foreign key) (0) | 2019.11.21 |
DB function procedure package (0) | 2019.11.07 |
Transaction (0) | 2019.10.10 |
댓글