반응형

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


반응형

+ Recent posts