source

BLOB Oracle 10g에 이미지 삽입

lovecheck 2023. 10. 19. 22:25
반응형

BLOB Oracle 10g에 이미지 삽입

BLOB 필드에 이미지를 삽입하려고 하는데 테이블에서 선택하여 보고서에 렌더링할 것입니다.어떻게 이미지를 테이블에 넣는지 알 수가 없습니다.그러나 제가 삽입을 했는데, 제가 렌더링할 때는 이미지 자체가 아니라 이미지 경로만 보고서에 나와 있었습니다.

테이블

CREATE TABLE esignatures (
  office   NUMBER(6,0)  NOT NULL,
  username VARCHAR2(10) NOT NULL,
  iblob    BLOB         NOT NULL
)

INSERT 문(SQL)

INSERT INTO esignatures  
VALUES (100, 'BOB', utl_raw.cast_to_raw('C:\pictures\image1.png'));

String 위치를 HEX 값 형태로 삽입하는 것을 확실히 알고 있습니다. 어떻게 하면 테이블에서 이미지 HEX 값을 얻을 수 있을까요? 그래서 렌더링할 때 이미지가 표시되는 것을 볼 수 있습니다.

pl/sql에서 로컬 디렉토리에 액세스할 수 없습니다.bfile을 사용하면 Oracle이 실행 중인 서버에 이미지를 넣어야 하는 디렉토리(create directory)를 설정합니다.

로컬 컴퓨터에서 몇 개의 이미지를 삽입하려면 클라이언트 사이드 앱이 있어야 합니다.당신이 직접 쓰실 수 있지만, 저는 보통 Toad를 사용합니다.스키마 브라우저에서 테이블을 클릭합니다.데이터 탭을 클릭하고 + 기호를 눌러 행을 추가합니다.BLOB 열을 두 번 클릭하면 마법사가 열립니다.맨 왼쪽 아이콘이 이미지를 블롭에 로드합니다.

enter image description here

SQL 개발자도 비슷한 기능을 가지고 있습니다.아래 "Load" 링크 참조:

enter image description here

이미지를 선 위로 끌어내야 할 경우 pl/sql을 사용하여 수행할 수 있지만 단순하지는 않습니다.먼저 사용자가 와이어를 풀오버할 수 있도록(보안상의 이유로) ACL 목록 액세스를 설정해야 합니다.ACL 설정에 대한 자세한 내용은 이 문서를 참조하십시오.

ACL이 완료되었다고 가정하면 다음과 같이 이미지를 당깁니다.

declare
    l_url varchar2(4000) := 'http://www.oracleimg.com/us/assets/12_c_navbnr.jpg';
    l_http_request   UTL_HTTP.req;
    l_http_response  UTL_HTTP.resp;
    l_raw RAW(2000);
    l_blob BLOB;
begin
   -- Important: setup ACL access list first!

    DBMS_LOB.createtemporary(l_blob, FALSE);

    l_http_request  := UTL_HTTP.begin_request(l_url);
    l_http_response := UTL_HTTP.get_response(l_http_request);

  -- Copy the response into the BLOB.
  BEGIN
    LOOP
      UTL_HTTP.read_raw(l_http_response, l_raw, 2000);
      DBMS_LOB.writeappend (l_blob, UTL_RAW.length(l_raw), l_raw);
    END LOOP;
  EXCEPTION
    WHEN UTL_HTTP.end_of_body THEN
      UTL_HTTP.end_response(l_http_response);
  END;

  insert into my_pics (pic_id, pic) values (102, l_blob);
  commit;

  DBMS_LOB.freetemporary(l_blob); 
end;

도움이 되길 바랍니다.

당신은 다음과 같은 일을 해야 합니다.

1) 디렉토리 개체 만들기서버측 액세스 가능 폴더를 가리킬 대상

CREATE DIRECTORY image_files AS '/data/images'
/

2) OS 폴더 디렉터리 개체 지점에 파일 배치

3) 파일에서 테이블로 데이터를 로드할 Oracle 스키마에 필요한 액세스 권한을 부여합니다.

GRANT READ ON DIRECTORY image_files TO scott
/

4) 아래와 같이 BFILENAME, EXHIT_BLOB 기능 및 DBMS_LOB 패키지(테스트되지 않은 예 - 주의)를 사용합니다.

DECLARE
  l_blob BLOB; 
  v_src_loc  BFILE := BFILENAME('IMAGE_FILES', 'myimage.png');
  v_amount   INTEGER;
BEGIN
  INSERT INTO esignatures  
  VALUES (100, 'BOB', empty_blob()) RETURN iblob INTO l_blob; 
  DBMS_LOB.OPEN(v_src_loc, DBMS_LOB.LOB_READONLY);
  v_amount := DBMS_LOB.GETLENGTH(v_src_loc);
  DBMS_LOB.LOADFROMFILE(l_blob, v_src_loc, v_amount);
  DBMS_LOB.CLOSE(v_src_loc);
  COMMIT;
END;
/

이 후에는 파일의 내용을 BLOB 열로 가져올 수 있으며 예를 들어 Java를 사용하여 파일을 다시 가져올 수 있습니다.

edit: 한 글자가 누락되었습니다. LOADFROMFILE이어야 합니다.

언급URL : https://stackoverflow.com/questions/21855935/inserting-image-into-blob-oracle-10g

반응형