С базой данных Oracle 11g и столбцом NCLOB в таблице я пытаюсь заменить текст другим текстом. На высоком уровне это довольно просто, я успешно справился с SQL-скриптом SQL-скрипта, но с Oracle все усложняется, в основном из-за того, что данные в столбце NCLOB могут иметь длину более 46k.Как выполнить поиск и заменить на NCLOB?
с ошибкой ORA-22835 (Буфер слишком мал для CLOB СИМВОЛУ или двоичных объектов для 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