Za předpokladu, že speciální zpracování je nutné pouze pro názvy jako 'S... , přidáním jednoduchého REPLACE měl by pracovat. BTW, nepotřebujete dva samostatné UPDATE příkazy - INITCAP automaticky převede jiné než počáteční znaky na malá písmena.:
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
To nahradí všechny výskyty 'S s 's . Pokud potřebujete řešit i jiné případy, doporučuji zkusit REGEXP_REPLACE() .
Funkce NLS_INITCAP
pomáhá s některými globalizačními problémy. Například, píše velkými písmeny jak I a J v IJSLAND . Ale to nepomůže s 'S jména. Nejsem si jistý, zda se jedná o chybu globalizačních funkcí Oracle, nebo zda jsou tyto názvy měst výjimkou.