Asumiendo que el manejo especial es necesario solo para nombres como 'S... , agregando un simple REPLACE Deberia trabajar. Por cierto, no necesitas dos UPDATE separados sentencias - INITCAP convertirá automáticamente los caracteres no iniciales a minúsculas.:
with v_data(name) as (
select 'AMSTERDAM' from dual union all
select '''S GRAVENHAGE' from dual union all
select 'DEN HAAG' from dual union all
select 'IJSLAND' from dual
)
select
replace(nls_initcap(name, 'NLS_SORT=xDutch'), '''S', '''s') name
from v_data
Name
----
Amsterdam
's Gravenhage
Den Haag
IJsland
Esto reemplazará todas las apariciones de 'S con 's . Si también necesita manejar otros casos, le sugiero que pruebe REGEXP_REPLACE() .
La función NLS_INITCAP
ayuda con algunos problemas de globalización. Por ejemplo, escribe en mayúscula tanto la I y el J en IJSLAND . Pero no ayuda con 'S nombres No estoy seguro de si se trata de un error con las funciones de globalización de Oracle o si esos nombres de ciudades son todas excepciones.