Oracle
 sql >> Base de données >  >> RDS >> Oracle

Procédure PL/SQL :METTRE À JOUR les noms en majuscules en initcaps, avec un traitement spécial pour certaines valeurs

En supposant que le traitement spécial n'est nécessaire que pour les noms comme 'S... , en ajoutant un simple REPLACE devrait marcher. BTW, vous n'avez pas besoin de deux UPDATE distincts instructions - INITCAP convertira automatiquement les caractères non initiaux en minuscules. :

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

Cela remplacera toutes les occurrences de 'S avec 's . Si vous devez également gérer d'autres cas, je vous suggère d'essayer REGEXP_REPLACE() .

La fonction NLS_INITCAP aide à résoudre certains problèmes de mondialisation. Par exemple, il capitalise à la fois le I et le J dans IJSLAND . Mais cela n'aide pas avec 'S des noms. Je ne sais pas s'il s'agit d'un bogue avec les fonctions de globalisation d'Oracle ou si ces noms de villes sont tous des exceptions.