2014-02-18 45 views
10

我试图将图像插入签名中的BLOB字段,然后我将从表中选择并在报表上呈现。我似乎无法想象如何将图像放入表格中。我做了一个插入,但是当我只呈现图像的路径显示在报告上,而不是图像本身。将图像插入到BLOB中Oracle 10g

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值,所以当我渲染时,我会看到正在显示的图像。

回答

14

您无法从pl/sql访问本地目录。如果您使用bfile,您将在运行Oracle的服务器上设置一个目录(create directory),您需要放置图像。

如果你想从本地机器插入一些图像,你需要一个客户端应用程序来做到这一点。你可以写你自己的,但我通常使用蟾蜍为此。在模式浏览器中,点击表格。点击数据标签,然后点击+号添加一行。双击BLOB列,打开一个向导。最左边的图标将图像加载到BLOB:

enter image description here

SQL Developer有类似的功能。请参见“装载”下面的链接:

enter image description here

如果您需要在电线拉的图像,你可以使用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; 

希望有所帮助。

+0

来插入这是一个非常好的信息,但是我的数据库是本地的。我有一个开发环境。 – devdar

+1

@devdar下载[SQL Developer IDE](http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html)并使用它(如上所示)。它适用于Oracle的所有东西;-) – tbone

+0

图像应该是.bmp格式。它只适用于BMP文件 –

7

你应该做这样的事情:

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为例。

编辑:遗漏一个字母:它应该是LOADFROMFILE。

+1

+1也许你应该强调一点,运行Oracle数据库的操作系统用户(在这种情况下可能是本地系统)需要访问该目录。 –

+0

运行oracle数据库的用户与数据库用户不一样。但是,你能告诉我在哪里创建目录 – devdar

+0

我试过这个,但它不起作用CREATE DIRECTORY myData AS'C:\ myData'; GRANT READ ON DIRECTORY images1 to devdar;该目录没有被创建devdar是OS用户。该目录未创建 – devdar