LONG RAW 속성을 가진 칼럼의 데이터를 추출 할 필요가 있어서 테스트 진행.
LONG RAW 칼럼에는 이미지 파일들이 들어가 있음.
- LONG RAW 칼럼은 PL/SQL에서 액세스가 되지 않으므로, LONG RAW 칼럼을 BLOB로 변경 함.
- 이미지 파일명은 PK 값으로 잡아서 해 주어야 중복이 발생하지 않음.
1. LONG RAW --> BLOB 로 변경
SQL> desc T_LONG Name Null? Type ----------------------- -------- ---------------- CHAM_CODE NOT NULL VARCHAR2(8) BULD_CODE NOT NULL VARCHAR2(4) BULD_GUBN NOT NULL VARCHAR2(2) BULD_TYPE NOT NULL VARCHAR2(2) BULD_NAME NOT NULL VARCHAR2(60) BULD_IMGE LONG RAW
SQL> CREATE TABLE T_LOB 2 AS 3 SELECT CHAM_CODE , BULD_CODE , BULD_GUBN , BULD_TYPE , BULD_NAME 4 , TO_LOB(BULD_IMGE) BULD_IMGE 5 FROM T_LONG;
SQL> desc T_LOB Name Null? Type ----------------------- -------- ---------------- CHAM_CODE NOT NULL VARCHAR2(8) BULD_CODE NOT NULL VARCHAR2(4) BULD_GUBN NOT NULL VARCHAR2(2) BULD_TYPE NOT NULL VARCHAR2(2) BULD_NAME NOT NULL VARCHAR2(60) BULD_IMGE BLOB
|
2. BLOB 칼럼의 이미지 파일을
SQL> connect / as sysdba
SQL> CREATE DIRECTORY dump_dir as '/tmp' ;
SQL> GRANT read , write ON DIRECTORY lob_dir TO scott ;
SQL> connect scott/tiger
다음의 PL/SQL 수행
DECLARE t_blob BLOB; t_len NUMBER; t_file_name VARCHAR2(100); t_output UTL_FILE.file_type; t_TotalSize number; t_position number := 1; t_chucklen NUMBER := 4096; t_chuck raw(4096); t_remain number; BEGIN -- Get length of blob
FOR i IN ( SELECT DBMS_LOB.getlength (buld_imge) length , buld_imge , cham_code || buld_code || buld_gubn || buld_type || buld_name || '_.jpg' as name FROM T_LOB WHERE DBMS_LOB.getlength (buld_imge) > 0 ) LOOP t_position := 1 ; t_chucklen := 4096 ; t_TotalSize := i.length ; t_file_name := i.name ; t_blob := i.buld_imge ; t_remain := t_TotalSize; t_output := UTL_FILE.fopen ('DUMP_DIR', t_file_name, 'wb', 32760);
-- Retrieving BLOB WHILE t_position < t_TotalSize LOOP DBMS_LOB.READ (t_blob, t_chucklen, t_position, t_chuck); UTL_FILE.put_raw (t_output, t_chuck); UTL_FILE.fflush (t_output); t_position := t_position + t_chucklen; t_remain := t_remain - t_chucklen;
IF t_remain < 4096 THEN t_chucklen := t_remain; END IF; END LOOP; UTL_FILE.fclose(t_output) ;
END LOOP ; EXCEPTION WHEN OTHERS THEN IF UTL_FILE.is_open(t_output) THEN UTL_FILE.fclose(t_output); END IF; DBMS_OUTPUT.PUT_LINE ( t_file_name || ' / '||to_char(t_TotalSize) ) ; DBMS_OUTPUT.PUT_LINE( 'ERROR : '||substr(sqlerrm,1,100) ); END; / |
3. JPG 파일 확인
SQL> !ls -al /tmp |