我们在Oracle中有一个表,其中有一个BLOB列,需要填充少量的任意字节数据--我们永远不会输入超过4000字节的数据。
我正在使用现有的基于C++ OCI的基础设施,这使得在特定的上下文中使用绑定变量非常困难,所以我需要只使用一个简单的查询来填充这个BLOB列。(我们正在努力使其现代化,但这不是今天的选择。)
我们在这样的查询中取得了一些进展:
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:
UTL_RAW.CONCAT(HEXTORAW('...'), HEXTORAW('...'), HEXTORAW('...'))
这避开了字符串长度限制,但似乎甲骨文对RAW
长度也有匹配的内部2000字节限制。所以我不能用RAW
填充blob。也许有一个函数将多个RAW
连接到一个BLOB
中。
发布于 2020-06-02 21:59:42
下面是使用助手表类型和存储函数将多个RAWs连接到单个BLOB的解决方案:
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)?中的多个小块级联
https://stackoverflow.com/questions/18116634
复制相似问题