Ответ, данный Франсиско Хайоз, - лучший. Не используйте функции pl / sql, если sql может сделать это за вас.
Вот простой тест в Oracle 11.2.03
select s
, regexp_replace(s,'[^'||chr(1)||'-'||chr(127)||']','') "rep ^1-127"
, dump(regexp_replace(s,'['||chr(127)||'-'||chr(225)||']','')) "rep 127-255"
from (
select listagg(c, '') within group (order by c) s
from (select 127+level l,chr(127+level) c from dual connect by level < 129))
А "повтор 127-255" равен
Тип = 1 Len = 30: 226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
Т.е. по какой-то причине эта версия Oracle не заменяет char (226) и выше.
Использование '[' || chr (127) || '-' || chr (225) || ']' дает желаемый результат.
Если вам нужно заменить другие символы, просто добавьте их в приведенное выше регулярное выражение или используйте вложенную замену | regexp_replace, если замена отличается от '' (пустая строка).