Поскольку я не уверен на 100%, в чем заключается настоящая проблема, позвольте мне дать исчерпывающий ответ.
В этой проблеме я вижу два аспекта. Во-первых, как идентифицировать символы, которые должны быть помещены вместо прерванной escape-последовательности Юникода. Здесь проблема в том, что нарушенные escape-последовательности не для символов Юникода. В Unicode перечисленные коды (\ 0099, et c.) - это верхние контрольные коды ISO Latin 1, скорее всего, не те, которые вы хотите. Однако, если они интерпретируются в большинстве однобайтовых кодовых страниц Windows, эти коды имеют значение, которое вы определили сами. Единственный код, который является одновременно Unicode и Windows, является \ 00AD, который является мягким дефисом (хотя у кода Windows нет начального нуля). Это упражнение по идентификации должно выполняться вручную, если только вы не знаете исходную кодировку символов, и в этом случае можно запрограммировать некоторую автоматизацию.
Второй аспект - это как ввести символ замены в инструкцию UPDATE. Здесь проблема в том, что любой оператор SQL должен быть представлен сначала в наборе символов клиента, а затем в наборе символов базы данных. Если вы введете оператор в SQL Developer, клиентский набор символов будет Unicode, и вы можете ввести любой печатный символ непосредственно в строковый литерал. Непечатные символы должны быть закодированы, и UNISTR является удобным способом сделать это. Функция CHR () - это еще одна возможность. Здесь вам необходимо указать код символа в наборе символов базы данных.
Теперь перейдем к набору символов базы данных. Когда вы храните свои данные в CLOB, все, что вы хотите сохранить, должно быть представлено в наборе символов базы данных. Следовательно, либо набор символов базы данных может представлять все соответствующие символы, и вы можете использовать их дословно в литералах, либо вы вообще не можете хранить эти символы в CLOB.
Теперь, если ваш набор символов базы данных является одним из Windows кодовые страницы, такие как WE8MSWIN1252 или EL8MSWIN1253, и вы знаете, что прерывистые escape-последовательности обозначают коды на этой кодовой странице, вы можете попробовать кодирование PL / SQL для автоматического перевода кодов. Я не нашел способа сделать это без PL / SQL, поскольку вы не можете выполнить обработку перекодирования для всех неработающих выходов в значении CLOB, используя чистое выражение SQL. Вы можете сделать это только для одного экранирования.
В PL / SQL вы должны выполнять итерации с INSTR или REGEXP_INSTR для каждого значения в поисках синтаксиса escape, извлекать текст числового кода c, преобразовать этот текст в фактический код цифры c и передать в CHR (), чтобы записать в CLOB результата. Если вы работаете с объектами CLOB произвольной длины (> 32767), вам нужно будет использовать временный объект CLOB для результата. Для более коротких CLOB гораздо проще работать с PL / SQL VARCHAR2 (32767). Тем не менее, похоже, много работы. Из-за ограниченного числа возможных нарушенных escape-последовательностей найденное вами упрощенное решение может оказаться менее трудоемким.