Как выполнить поиск и заменить на 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
И таким образом вы избежите проблем с переполнением буфера, так как не о чем заботиться.