2013-06-28 4 views
0

С базой данных 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 

ответ

0

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

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

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