티스토리 뷰

oracle

hex string 을 blob 에 입력하기

pajama 2017. 3. 2. 13:27
반응형

4KB가 넘는 이미지 데이터가 hex string으로 존재하고 이를 이미지 형태로 ORACLE 테이블에 입력하는 테스트를 해보았습니다.

먼저 아래와 같은 함수를 만듭니다. 함수는 stack overflow의 글에서 참조했습니다.

기본적인 기능만 있어 예외처리가 추가로 필요할 수 있습니다.

create or replace function hextoblob(data in clob) return blob
is
    v_blob    blob;
    v_start  pls_integer := 1;
    v_buffer pls_integer := 4000;
begin
    if data is null
    then
        return '""';
    end if;

    dbms_lob.createtemporary(v_blob, true);
    for i in 1..ceil(dbms_lob.getlength(data) / v_buffer)
    loop
        dbms_lob.append(v_blob, hextoraw(DBMS_LOB.SUBSTR(data, v_buffer, v_start)));
        v_start := v_start + v_buffer;
    end loop; 
    return v_blob;

end;

 

 

작업 전에 hex string 데이터를 CLOB 필드에 입력합니다. 

$ sqlplus scott/tiger

SQL> create table img (img clob);

Table created.

$ cat img.ctl     << SQL*Loader control file
load data
infile '/work2/INFORMIX/1150FC9W3/HDR_PRI/unload/img.unl'
append
into table img
( IMG CHAR(1000000) )

$  sqlldr userid=scott/tiger control='./img.ctl'

SQL*Loader: Release 11.2.0.1.0 - Production on Tue Nov 22 10:51:25 2016

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 1

 

그리고 입력된 hex string 을 4000바이트씩 자른 후, hextoraw 함수로 변환하는 것입니다.

hextoraw 함수는 CHAR, VARCHAR2, NCHAR, NVARCHAR2 타입만 지원하므로 잘라서 처리해야 합니다.

SQL> create table test_lob (img blob);

Table created.

SQL> insert into test_lob select hextoblob(img) from img;

1 row created.

 

참조 사이트:

http://stackoverflow.com/questions/8549138/oracle-rawtohex-function-what-happens-if-return-value-exceeds-varchar2-limit

 

 

반응형
댓글