如何将大十六进制插入 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。
我正在构建一个带有 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。