如何将大十六进制插入BLOB列?

时间:2015-02-11 11:13:38

标签: c oracle plsql

我正在构建一个带有PL / SQL的C程序,它会创建一个QRCODE bmp并保存该文件,但是我需要将它发送到BLOB类型的表列,问题是我没有访问权限到Oracle服务器目录,所以我无法“上传”该文件。我一直在尝试使用函数HEXTORAW(oracle function)通过更新查询发送十六进制,如下所示:

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

但是十六进制字符串太大而无法更新并且说字符串只能有4000个字符...字符串有5623个字符,但显然可以根据生成的QRCODE的大小来更多。有没有其他方法可以做到这一点?

1 个答案:

答案 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