【发布时间】:2013-06-28 16:52:34
【问题描述】:
使用 Oracle 11g 数据库和表中的 NCLOB 列,我试图用另一个文本替换一些文本。在高层次上,这很简单,我在一个 SQL Server 版本的 SQL 脚本上成功地完成了,但是使用 Oracle,事情变得复杂了,主要是因为 NCLOB 列中的数据长度很容易超过 46k。
出现 ORA-22835 错误(对于 CLOB 到 CHAR 或 BLOB 到 RAW 转换的缓冲区太小),由于数据长度可变,因此无法执行建议的操作,并且将其分块带有 SUBSTR 的数据可能会在我的“搜索字符串”中间拆分,以便在数据中找到。
我正在寻找一种可以在 SQL 脚本中使用的简单明了的解决方案。
这是我在 SQL Server 中使用的脚本示例:
DECLARE @replacestring NVarChar(MAX) = '0D0D000402175300008950.. very long string 46k+ in length ..1CA68848EEB58360000000049454E44AE426082'
DECLARE @oldFingerprintStart NVarChar(MAX) = '0D0D0004002BA80000FFD8FFE000104A46494600010201004800480000FFE10B304578696600004D4D002A0000000800070';
DECLARE @oldFingerprintEnd NVarChar(MAX) = '02800A002800A002800A002800A002800A002800A002800A002800A002800A002800A002800A002800A002800A002803FFD9';
UPDATE Table1
SET datacolumn =
CONCAT(
SUBSTRING(datacolumn, 0, CHARINDEX(@oldFingerprintStart, datacolumn)),
@replacestring,
SUBSTRING(datacolumn, CHARINDEX(@oldFingerprintEnd, datacolumn) + LEN(@oldFingerprintEnd), LEN(datacolumn) - (CHARINDEX(@oldFingerprintEnd, datacolumn) + LEN(@oldFingerprintEnd))+1)
)
WHERE CHARINDEX(@oldFingerprintStart, datacolumn) > 0
AND CHARINDEX(@oldFingerprintEnd, datacolumn) > 0
【问题讨论】: