2014-02-18 183 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