2015-02-11 79 views
2

我正在用PL/SQL建立一个C程序,它创建一个QRCODE bmp并保存该文件,但我需要将它发送到BLOB类型的表列,问题是我没有访问权限Oracle服务器目录,所以我不能“上传”该文件。我一直在试图通过与功能HEXTORAW(Oracle函数)更新查询发送六角这样的:如何将大十六进制插入到BLOB列中?

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

但十六进制字符串是如此之大,它无法更新,并表示该字符串只能有4000字符...该字符串有5623个字符,但显然可以根据生成的QRCODE的大小更多。有没有其他办法可以做到这一点?

+0

感叹。十六进制是打印的表示,而不是数据类型。 – EJP 2015-02-11 11:37:24

+1

如果您可以将文件放置在oracle服务器可以访问的网络(局域网或广域网)上,那么这个问题的接受答案中的最后一个选项可以解决这个问题:http://stackoverflow.com/questions/21855935/insert-image-into-blob-oracle-10g – 2015-02-11 11:37:55

+1

我不能......有没有一种方法可以通过“pieces”构建一个pl/sql块的BLOB对象? – Vcoder 2015-02-11 11:42:14

回答

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; 
/

显然,这不是它意味着要完成的方式。如果可以,使用文件是更好的选择。

编辑:

甲骨文如何在Pro * C/C++预编译器程序员指南的LOB章撰写研究从C LOB examples

+0

工作就像一个魅力! – Vcoder 2015-02-11 12:27:02

+1

只要图像很小就可以工作。如果你需要能够处理大的斑点,这个方法将非常麻烦。 – 2015-02-11 12:28:53

+0

明天我会再次选择并提供一些反馈。 – Vcoder 2015-02-11 16:58:09