我正在构建一个带有PL / SQL的C程序,它会创建一个QRCODE bmp并保存该文件,但是我需要将它发送到BLOB类型的表列,问题是我没有访问权限到Oracle服务器目录,所以我无法“上传”该文件。我一直在尝试使用函数HEXTORAW(oracle function)通过更新查询发送十六进制,如下所示:
update test set qrcodeIMG=hextoraw('424df64a010000...');
但是十六进制字符串太大而无法更新并且说字符串只能有4000个字符...字符串有5623个字符,但显然可以根据生成的QRCODE的大小来更多。有没有其他方法可以做到这一点?
答案 0 :(得分: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;
/
显然,这不是它的意图。如果可以,使用文件是更好的选择。
修改强>
Oracle在Pro * C / C ++预编译程序程序员指南的LOB章节中有关如何正确编写LOB的examples。