Supponendo che la gestione speciale sia necessaria solo per nomi come 'S... , aggiungendo un semplice REPLACE dovrebbe funzionare. A proposito, non hai bisogno di due UPDATE separati istruzioni - INITCAP convertirà automaticamente i caratteri non iniziali in minuscolo.:
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
Questo sostituirà tutte le occorrenze di 'S con 's . Se hai bisogno di gestire anche altri casi, ti suggerisco di provare REGEXP_REPLACE() .
La funzione NLS_INITCAP
aiuta con alcuni problemi di globalizzazione. Ad esempio, mette in maiuscolo sia la I e il J in IJSLAND . Ma non aiuta con 'S nomi. Non sono sicuro se si tratti di un bug con le funzioni di globalizzazione di Oracle o se quei nomi di città siano tutte eccezioni.