首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle 10:使用HEXTORAW填充blob数据

Oracle 10:使用HEXTORAW填充blob数据
EN

Stack Overflow用户
提问于 2013-08-08 01:41:42
回答 5查看 14.3K关注 0票数 7

我们在Oracle中有一个表,其中有一个BLOB列,需要填充少量的任意字节数据--我们永远不会输入超过4000字节的数据。

我正在使用现有的基于C++ OCI的基础设施,这使得在特定的上下文中使用绑定变量非常困难,所以我需要只使用一个简单的查询来填充这个BLOB列。(我们正在努力使其现代化,但这不是今天的选择。)

我们在这样的查询中取得了一些进展:

代码语言:javascript
运行
复制
UPDATE MyTable
   SET blobData = HEXTORAW('0EC1D7FA6B411DA5814...lots of hex data...0EC1D7FA6B411DA5814')
 WHERE ID = 123;

起初,这件事做得很好。然而,最近我们遇到了一个情况,我们需要输入超过2000字节的数据。此时,我们遇到了一个Oracle,ORA-01704: string literal too long,因为传递给HEXTORAW的字符串超过了4000个字符。我试着拆分字符串,然后与||连接,但这并没有避免错误。

因此,我需要一种方法来更新这个列,并使用一个简单的查询来填充超过2000字节的数据。有可能吗?

(我知道,如果我有绑定变量,这将是微不足道的--事实上,其他与这个表交互的应用程序使用了精确的技术--但不幸的是,我无法在这里重构DB内核。)只需将数据放入表中即可。)

编辑:

一个很有希望的方法没有奏效,那就是连接RAWs:

代码语言:javascript
运行
复制
UTL_RAW.CONCAT(HEXTORAW('...'), HEXTORAW('...'), HEXTORAW('...'))

这避开了字符串长度限制,但似乎甲骨文对RAW长度也有匹配的内部2000字节限制。所以我不能用RAW填充blob。也许有一个函数将多个RAW连接到一个BLOB中。

EN

Stack Overflow用户

发布于 2020-06-02 21:59:42

下面是使用助手表类型和存储函数将多个RAWs连接到单个BLOB的解决方案:

代码语言:javascript
运行
复制
create or replace type raws as table of raw(2000);

create or replace function concat_raws(parts in raws) return blob
is
    temp blob;
begin
    if parts is null or parts.count = 0 then
       return null;
    end if;
    dbms_lob.createtemporary(temp, false, dbms_lob.CALL);
    for i in parts.first .. parts.last
    loop
        dbms_lob.append(temp, to_blob(parts(i)));
    end loop;
    return temp;
end;

-- usage example:
select concat_raws(raws(hextoraw('CAFE'), hextoraw('BABE'))) from dual;

这种方法对于自动生成sql也很方便,如我对SQL / JDBC中的内联BLOB /二进制数据类型的另一个答案所示。

还请参阅如何连接BLOB字段(Oracle)?中的多个小块级联

票数 0
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18116634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档