Как выполнить поиск и заменить на NCLOB?

С помощью базы данных Oracle 11g и столбца NCLOB в таблице я пытаюсь заменить один текст другим текстом. На высоком уровне это довольно просто, я успешно сделал это на SQL-версии сценария SQL, но с Oracle все усложняется, в основном из-за того, что длина данных в столбце NCLOB может легко превышать 46 КБ.

С ошибкой 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 ответ

Вы можете найти хорошее и подробное объяснение здесь, но что касается моего опыта (и, как указано в документации Oracle), стандарт REPLACE функция работает на NCLOB поля так же, как на VARCHAR2,

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

И таким образом вы избежите проблем с переполнением буфера, так как не о чем заботиться.

Другие вопросы по тегам