2015-02-11 46 views
2

我正在用PL/SQL建立一個C程序,它創建一個QRCODE bmp並保存該文件,但我需要將它發送到BLOB類型的表列,問題是我沒有訪問權限Oracle服務器目錄,所以我不能「上傳」該文件。我一直在試圖通過與功能HEXTORAW(Oracle函數)更新查詢發送六角這樣的:如何將大十六進制插入到BLOB列中?

update test set qrcodeIMG=hextoraw('424df64a010000...'); 

但十六進制字符串是如此之大,它無法更新,並表示該字符串只能有4000字符...該字符串有5623個字符,但顯然可以根據生成的QRCODE的大小更多。有沒有其他辦法可以做到這一點?

+0

感嘆。十六進制是打印的表示,而不是數據類型。 – EJP 2015-02-11 11:37:24

+1

如果您可以將文件放置在oracle服務器可以訪問的網絡(局域網或廣域網)上,那麼這個問題的接受答案中的最後一個選項可以解決這個問題:http://stackoverflow.com/questions/21855935/insert-image-into-blob-oracle-10g – 2015-02-11 11:37:55

+1

我不能......有沒有一種方法可以通過「pieces」構建一個pl/sql塊的BLOB對象? – Vcoder 2015-02-11 11:42:14

回答

1

由於每個參數的大小都有限,所以問題是將數據從C傳輸到PL函數。如果圖像的最大尺寸已知,則可以用足夠的參數聲明函數/過程並剪切數據。不幸的是,RAW數據類型被限制爲2000字節:

CREATE OR REPLACE PROCEDURE insert_blob(key test.id%type, 
     part1 RAW(2000), 
     part2 RAW(2000), 
     part3 RAW(2000), 
     part4 RAW(2000), 
     part5 RAW(2000)), 
     part6 RAW(2000)), 
     part7 RAW(2000)), 
     part8 RAW(2000)), 
     part9 RAW(2000)), 
     part10 RAW(2000)) AS 
    l_blob BLOB; 
BEGIN 
    DBMS_LOB.createtemporary(l_blob, FALSE); 
    DBMS_LOB.writeappend (l_blob, UTL_RAW.length(part1), part1); 
    DBMS_LOB.writeappend (l_blob, UTL_RAW.length(part2), part2); 
    DBMS_LOB.writeappend (l_blob, UTL_RAW.length(part3), part3); 
    DBMS_LOB.writeappend (l_blob, UTL_RAW.length(part4), part4); 
    DBMS_LOB.writeappend (l_blob, UTL_RAW.length(part5), part5); 
    DBMS_LOB.writeappend (l_blob, UTL_RAW.length(part6), part6); 
    DBMS_LOB.writeappend (l_blob, UTL_RAW.length(part7), part7); 
    DBMS_LOB.writeappend (l_blob, UTL_RAW.length(part8), part8); 
    DBMS_LOB.writeappend (l_blob, UTL_RAW.length(part9), part9); 
    DBMS_LOB.writeappend (l_blob, UTL_RAW.length(part10), part10); 
    UPDATE test SET qrcodeIMG = l_blob WHERE id = key; 
    commit; 
    DBMS_LOB.freetemporary(l_blob); 
END; 
/

顯然,這不是它意味着要完成的方式。如果可以,使用文件是更好的選擇。

編輯:

甲骨文如何在Pro * C/C++預編譯器程序員指南的LOB章撰寫研究從C LOB examples

+0

工作就像一個魅力! – Vcoder 2015-02-11 12:27:02

+1

只要圖像很小就可以工作。如果你需要能夠處理大的斑點,這個方法將非常麻煩。 – 2015-02-11 12:28:53

+0

明天我會再次選擇並提供一些反饋。 – Vcoder 2015-02-11 16:58:09