【问题标题】:How to perform a search and replace on a NCLOB?如何在 NCLOB 上执行搜索和替换?
【发布时间】: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

【问题讨论】:

    标签: oracle nclob


    【解决方案1】:

    你可以找到很好的详细解释here,但就我的经验而言(正如Oracle documentation 所述),标准REPLACE 函数在NCLOB 字段上的工作方式与@987654325 相同@。

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 2015-02-15
      • 2020-08-09
      • 1970-01-01
      相关资源
      最近更新 更多