由于每个参数的大小都有限,所以问题是将数据从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