我正在尝试将图像插入到签名中的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'));
我知道我确定以HEX值的形式插入String位置如何在表格中获取图像HEX值,因此当我渲染时我将看到正在显示的图像。
答案 0 :(得分:15)
您无法从pl / sql访问本地目录。如果使用bfile,则将在运行Oracle的服务器上设置一个目录(create directory),您需要放置图像。
如果要从本地计算机插入少量图像,则需要客户端应用程序才能执行此操作。你可以编写自己的,但我通常使用Toad。在架构浏览器中,单击表格。单击数据选项卡,然后单击+符号以添加行。双击BLOB列,将打开一个向导。最左边的图标会将图像加载到blob中:
SQL Developer具有类似的功能。请参阅下面的“加载”链接:
如果您需要通过线路提取图像,可以使用pl / sql进行,但不是直截了当。首先,您需要设置ACL列表访问(出于安全原因)以允许用户拔出电线。有关ACL设置的更多信息,请参阅this article。
假设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 :(得分:7)
你应该这样做:
1)创建指向服务器端可访问文件夹的目录对象
CREATE DIRECTORY image_files AS '/data/images'
/
2) 将文件放入OS文件夹目录对象指向
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将其恢复。
编辑:丢失了一个字母:它应该是LOADFROMFILE。