gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:50 27 4
gpt4 key购买 nike

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

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

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

最佳答案

问题是将数据从 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 有 examples在 Pro*C/C++ 预编译器程序员指南的 LOB 章节中关于如何从 C 正确编写 LOB。

关于c - 如何将大十六进制插入 BLOB 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28452913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com