Вставка изображения в 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:picturesimage1.png'));

Я точно знаю, что вставляю строку расположение в виде шестнадцатеричного значения как я могу получить шестнадцатеричное значение изображения в таблице, чтобы при рендеринге я видел отображаемое изображение.

2 ответов


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

Если вы хотите вставить несколько изображений с локального компьютера, вам понадобится клиентское приложение для этого. Вы можете написать свой собственный, но я обычно использую жабу для этого. В обозревателе схем щелкните по таблице. Перейдите на вкладку Данные и нажмите + знак, чтобы добавить строку. Дважды щелкните столбец BLOB, и откроется мастер. Крайний левый значок загрузит изображение в 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;

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


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

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.