Хотя это не чисто SQL-решение, другим вариантом будет определение функции, которая преобразует строку по желанию, возможно, вызывая ее REPLACE_MULTI. Вызов будет что-то вроде
SELECT REPLACE_MULTI('This Is An Example Of The String',
'Is|An|Of|The',
'is|an|of|the')
FROM DUAL;
и реализация будет что-то вроде
CREATE OR REPLACE FUNCTION REPLACE_MULTI(strOriginal IN VARCHAR2,
strTokens_to_replace IN VARCHAR2,
strReplacement_tokens IN VARCHAR2)
RETURN VARCHAR2
IS
strResult VARCHAR2(2000);
arrTokens_to_replace DBMS_SQL.VARCHAR2A;
arrReplacement_tokens DBMS_SQL.VARCHAR2A;
i NUMBER;
FUNCTION extract_tokens(p_string IN VARCHAR2,
p_separators IN VARCHAR2) RETURN DBMS_SQL.VARCHAR2A
IS
arrTokens DBMS_SQL.VARCHAR2A;
BEGIN
WITH sel_string AS
(SELECT p_string AS fullstring FROM DUAL)
SELECT SUBSTR(fullstring, beg + 1, end_p - beg - 1) AS token
BULK COLLECT INTO arrTokens
FROM (SELECT beg, LEAD(beg) OVER (ORDER BY beg) AS end_p, fullstring
FROM (SELECT beg, fullstring
FROM (SELECT LEVEL beg, fullstring
FROM sel_string
CONNECT BY LEVEL <= LENGTH(fullstring))
WHERE INSTR(p_separators, SUBSTR(fullstring, beg, 1)) > 0
UNION ALL
SELECT 0, fullstring FROM sel_string
UNION ALL
SELECT LENGTH(fullstring) + 1, fullstring FROM sel_string))
WHERE end_p IS NOT NULL AND
end_p > beg + 1;
RETURN arrTokens;
END extract_tokens;
BEGIN
arrTokens_to_replace := extract_tokens(strTokens_to_replace, '|');
arrReplacement_tokens := extract_tokens(strReplacement_tokens, '|');
strResult := strOriginal;
FOR i IN 1..arrTokens_to_replace.COUNT LOOP
strResult := REGEXP_REPLACE(strResult,
'^' || arrTokens_to_replace(i) || ' ',
arrReplacement_tokens(i));
strResult := REPLACE(strResult,
' ' || arrTokens_to_replace(i) || ' ',
' ' || arrTokens_to_replace(i) || ' ');
strResult := REGEXP_REPLACE(strResult,
' ' || arrTokens_to_replace(i) || '$',
' ' || arrReplacement_tokens(i));
END LOOP;
RETURN strResult;
END REPLACE_MULTI;
Я уверен, что есть строки токенов, которые можно создать, которые прервут синтаксический анализ на основе регулярных выражений (попробуйте ввести '^' или '$' и посмотреть, как летят искры :-), но это хорошо достаточно для первоначального взлома.
(Кстати, рутина 'extract_tokens' не моя - я нашел ее в Интернете некоторое время назад и вечно благодарен тому, кто это создал).
Делись и наслаждайся.