Вставка изображения в 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:
SQL Developer имеет аналогичную функцию. См. ссылку "Загрузить" ниже:
Если вам нужно вытянуть изображения по проводу, вы можете сделать это с помощью 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.