由於每個參數的大小都有限,所以問題是將數據從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。
感嘆。十六進制是打印的表示,而不是數據類型。 – EJP 2015-02-11 11:37:24
如果您可以將文件放置在oracle服務器可以訪問的網絡(局域網或廣域網)上,那麼這個問題的接受答案中的最後一個選項可以解決這個問題:http://stackoverflow.com/questions/21855935/insert-image-into-blob-oracle-10g – 2015-02-11 11:37:55
我不能......有沒有一種方法可以通過「pieces」構建一個pl/sql塊的BLOB對象? – Vcoder 2015-02-11 11:42:14