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

How to insert a large hex into a BLOB column?

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

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

但是十六进制字符串太大,更新失败,说字符串只能有4000个字符...字符串有5623个字符,但根据生成的QRCODE的大小,它显然可以有更多。我还有其他方法可以做到这一点吗?

问题是将数据从 C 传输到 PL 函数,因为每个参数的大小都有限制。如果已知图像的最大尺寸,您可以声明一个带有足够参数的 function/procedure 并分割数据。不幸的是,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 章节中有关于如何从 C 正确编写 LOB 的内容examples