Zakładając, że specjalna obsługa jest konieczna tylko dla nazw takich jak 'S... , dodając prosty REPLACE powinno działać. BTW, nie potrzebujesz dwóch oddzielnych UPDATE instrukcje - INITCAP automatycznie skonwertuje znaki inne niż początkowe na małe litery.:
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
Spowoduje to zastąpienie wszystkich wystąpień 'S z 's . Jeśli potrzebujesz zająć się również innymi przypadkami, proponuję spróbować REGEXP_REPLACE() .
Funkcja NLS_INITCAP
pomaga w niektórych kwestiach związanych z globalizacją. Na przykład pisuje zarówno I i J w IJSLAND . Ale to nie pomaga w przypadku 'S nazwy. Nie jestem pewien, czy jest to błąd w funkcjach globalizacji Oracle, czy te wszystkie nazwy miast są wyjątkami.