使用 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