Вставка изображения в 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 изображения в таблице, поэтому, когда я визуализую, я увижу отображаемое изображение.

Ответ 1

Вы не можете получить доступ к локальному каталогу из pl/sql. Если вы используете bfile, вы создадите каталог (создать каталог) на сервере, где работает Oracle, где вам нужно будет поместить ваши изображения.

Если вы хотите вставить несколько изображений с вашего локального компьютера, для этого вам понадобится приложение на стороне клиента. Вы можете написать свой собственный, но я обычно использую Toad для этого. В браузере схемы нажмите на таблицу. Перейдите на вкладку данных и нажмите + знак, чтобы добавить строку. Дважды щелкните столбец BLOB, и откроется мастер. Значок в левом углу загрузит изображение в блок:

enter image description here

SQL Developer имеет аналогичную функцию. См. Ссылку "Загрузить" ниже:

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;

Надеюсь, что это поможет.

Ответ 2

Вы должны сделать что-то вроде этого:

1) создать объект каталога, что указывает на доступную папку на стороне сервера

CREATE DIRECTORY image_files AS '/data/images'
/

2) Поместите файл в точку объекта каталога папки ОС на

3) Предоставьте необходимые права доступа к схеме Oracle, что будет загружать данные из файла в таблицу:

GRANT READ ON DIRECTORY image_files TO scott
/

4) Используйте функции BFILENAME, EMPTY_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.