sql - 甲骨文10 : Using HEXTORAW to fill in blob data

标签 sql oracle blob varbinary

我们在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/

相关文章:

javascript - 列出内存中的所有 Blob 以便在 javascript 中进行调试

c# - 如何从access数据库中获取多行数据

sql - Erlang ODBC 连接挑战

mysql - 如何合并插入合并多个表

sql - 如何根据特定字段中的数据向查询添加行

oracle - 如何在PL/SQL Developer中调试流水线函数?

php - 使用准备好的语句上传图像文件位置

mysql - 如何将类型 blob 图像显示到 ejs 网页?

mysql - SQL查询FOR中的动态表名

SQL : Error converting data type nvarchar to float