Oracle 10:使用HEXTORAW填充blob数据

Sti*_*sis 6 sql oracle blob varbinary

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

我正在使用现有的基于C++ OCI的基础结构,这使得在某些上下文中使用绑定变量非常困难,因此我需要仅使用简单查询来填充此BLOB列.(我们正在努力使其现代化,但今天不是一种选择,)

我们对这样的查询运气不错:

UPDATE MyTable
   SET blobData = HEXTORAW('0EC1D7FA6B411DA5814...lots of hex data...0EC1D7FA6B411DA5814')
 WHERE ID = 123;
Run Code Online (Sandbox Code Playgroud)

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

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

(我知道如果我拥有绑定变量,那将是微不足道的 - 实际上与该表交互的其他应用程序使用这种确切的技术 - 但不幸的是我无法在这里重构数据库内容.只需要将数据输入表格.)

编辑:

一种没有用的有希望的方法是连接RAW:

UTL_RAW.CONCAT(HEXTORAW('...'), HEXTORAW('...'), HEXTORAW('...'))
Run Code Online (Sandbox Code Playgroud)

这避免了字符串长度限制,但似乎Oracle在a的长度上也有一个匹配的内部2000字节限制RAW.所以我不能用一个填充blob RAW.也许有一个函数可以将多个RAWs 连接成一个BLOB.

mik*_*mik 6

要更新BLOB超过 16383 字节的内容,可能会使用这样的内容(每行有偶数个十六进制数字,最多 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;
Run Code Online (Sandbox Code Playgroud)

现在限制只是语句的大小,这可能是由操作环境(例如 SQLPlus、Pro*C、VB、JDBC...)强加的。对于非常大的语句,PL/SQL 也可能会因“超出 Diana 节点”错误而失败。


Sti*_*sis 5

显然,如果使用PL/SQL,则可以超出这些限制.如果直接HEXTORAWUPDATE语句中执行它也不起作用- 它需要在单独的语句中完成,如下所示:

DECLARE
  buf RAW(4000); 
BEGIN
  buf := HEXTORAW('C2B97041074...lots of hex...0CC00CD00');
  UPDATE MyTable
     SET blobData = buf
   WHERE ID = 462;
END;
Run Code Online (Sandbox Code Playgroud)

对于我的生活,我永远不会理解甲骨文的一些局限性.这就像一切都是它自己的小特例.