如何在NCLOB上执行搜索和替换?

时间:2013-06-28 16:52:34

标签: oracle nclob

使用Oracle 11g数据库和表中的NCLOB列,我试图用另一个文本替换一些文本。在高层次上,它非常简单,我在SQL脚本的SQL Server上成功完成了它,但是对于Oracle来说,事情变得越来越复杂,主要是因为NCLOB列中的数据可以轻松超过46k in长度。

错误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

1 个答案:

答案 0 :(得分:0)

您可以找到详细而详细的解释here,但就我的经验而言(以及Oracle documentation中所述),标准REPLACE功能适用于NCLOB字段同样的方式,就像在VARCHAR2上一样。

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

这样你就可以避免缓冲区溢出的任何麻烦,因为没有人可以处理。