我们在Oracle中有一个带有BLOB列的表,需要用少量的任意字节数据填充——我们永远不会放入超过4000字节的数据。
我正在使用现有的基于 C++ OCI 的基础设施,这使得在某些上下文中使用绑定(bind)变量变得极其困难,因此我需要仅使用简单的查询来填充此 BLOB 列。 (我们正在努力使其现代化,但目前这不是一个选择,)
我们很幸运地完成了这样的查询:
UPDATE MyTable
SET blobData = HEXTORAW('0EC1D7FA6B411DA5814...lots of hex data...0EC1D7FA6B411DA5814')
WHERE ID = 123;
起初,这效果很好。然而,最近我们遇到了一个情况,需要放入超过2000字节的数据。此时,我们遇到了 Oracle 错误,ORA-01704:字符串文字太长
,因为传递给 HEXTORAW
的字符串超过 4000 个字符。我尝试拆分字符串,然后用 ||
连接,但这并没有避免错误。
因此,我需要一种方法来更新此列并使用简单的查询填充超过 2000 字节的数据。是否可以?
(我知道如果我可以使用绑定(bind)变量,这将是微不足道的 - 事实上与此表交互的其他应用程序使用了这种确切的技术 - 但不幸的是我无法在这里重构数据库内容.只需将数据获取到表中即可。)
编辑:
一种很有前途但行不通的方法是连接 RAW:
UTL_RAW.CONCAT(HEXTORAW('...'), HEXTORAW('...'), HEXTORAW('...'))
这避开了字符串长度限制,但 Oracle 似乎对 RAW
的长度也有一个匹配的内部 2000 字节限制。所以我无法用 RAW
填充 blob。也许有一个函数可以将多个 RAW 连接成一个 BLOB。
最佳答案
要更新长度超过 16383 字节的 BLOB
,可以使用类似的内容(每行有偶数个十六进制数字,最多 32766):
DECLARE
buf BLOB;
BEGIN
dbms_lob.createtemporary(buf, FALSE);
dbms_lob.append(buf, HEXTORAW('0EC1D7FA6B411DA58149'));
--...lots of hex data...
dbms_lob.append(buf, HEXTORAW('0EC1D7FA6B411DA58149'));
UPDATE MyTable
SET blobData = buf
WHERE ID = 123;
END;
现在限制只是语句的大小,这可能是由操作环境(例如 SQLPlus、Pro*C、VB、JDBC...)强加的。对于非常大的语句,PL/SQL 也可能会失败并出现“超出 Diana 节点”错误。
关于sql - 甲骨文10 : Using HEXTORAW to fill in blob data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18116634/