0

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

1 回答 1

0

你可以在这里找到很好的详细解释,但就我的经验而言(正如Oracle 文档中所述),标准REPLACE函数在NCLOB字段上的工作方式与VARCHAR2.

UPDATE a_table 
SET that_field = REPLACE(that_field, 'XYZ', 'ABC') 
WHERE CONTAINS(that_field, 'XYZ') > 0

这样你就可以避免缓冲区溢出的任何问题,因为没有人需要照顾。

于 2013-06-29T17:59:09.417 回答