【问题标题】:replace blob with random string用随机字符串替换 blob
【发布时间】:2017-03-08 03:16:18
【问题描述】:

我正在使用 Oracle 11g。我的一个表有一个 blob 类型的列。我试图用与列中现有值相同长度的随机字符串替换此列中的值。这就是我所做的:

`update order set info = XMLSERIALIZE(CONTENT XMLTYPE('<edit>'||DBMS_RANDOM.STRING('X', length(info))||'</edit>') as blob) where info is not null;` 

由于其中一行的长度为 190,000,我遇到了一个错误提示

字符串连接结果大于最大大小。

还有其他方法吗?

【问题讨论】:

  • 为什么将文本数据存储为 BLOB 而不是 CLOB?

标签: database oracle blob


【解决方案1】:

maximum length of a VARCHAR2 in SQL is 4000 bytes in Oracle 11g。您尝试针对超过 3987 字节(&lt;edit&gt;&lt;/edit&gt; 标记为 4000 减去 13)运行此语句的任何行都将导致错误,因为您将超过 4000 字节限制。

您可以:

  • 将长度限制为 3987,例如: DBMS_RANDOM.STRING('X', GREATEST(length(info), 3987))
  • 或者使用 PL/SQL 和 dbms_lob 包来构建所需的 blob。 PL/SQL 的最大 VARCHAR2 长度为 32767 字节,但也允许循环结构,允许您在 32767 个块中循环 length(info) 并使用 dbms_lob.append 将数据附加到 lob 变量。

编辑:使用 GREATEST 而不是 MAX。

【讨论】:

  • 感谢 mleonard 的回复,当我使用 DBMS_RANDOM.STRING('X', MAX(length(info), 3987)) 时出现错误提示 此处不允许使用群组功能
  • 抱歉,我的意思是 GREATEST,而不是 MAX。我已经编辑了我的答案,请检查那里的代码。
猜你喜欢
  • 1970-01-01
  • 2017-05-20
  • 2015-01-20
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 2021-06-12
相关资源
最近更新 更多