
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
TO_NUMBER Oracle : Convertir une chaîne de caractères en nombre
La fonction TO_NUMBER est l’une des fonctions de conversion les plus utilisées en Oracle SQL. Elle permet de transformer une chaîne de caractères ou une valeur en un type numérique exploitable dans des calculs, des comparaisons ou des agrégations. Maîtriser TO_NUMBER est indispensable pour tout développeur ou analyste travaillant avec des bases de données Oracle en environnement professionnel.
Définition et utilisation de TO_NUMBER
La fonction TO_NUMBER convertit une expression — généralement une chaîne de caractères (CHAR, VARCHAR2, NCHAR, NVARCHAR2) ou un type NUMBER — vers le type de données NUMBER d’Oracle.
En entreprise, ce besoin est omniprésent dans les situations suivantes :
- Imports de données : les fichiers CSV ou les flux XML/JSON contiennent souvent des montants monétaires stockés sous forme de texte (
'1 250,99','$3000.00'). - Interfaces entre systèmes : des applications tierces transmettent des valeurs numériques encodées en chaînes vers la base Oracle.
- Calculs financiers : avant d’additionner ou de comparer des colonnes textuelles contenant des prix, des taux ou des quantités, une conversion explicite est nécessaire.
- Nettoyage et transformation de données : dans les pipelines ETL (Extract, Transform, Load),
TO_NUMBERest une brique fondamentale pour garantir la qualité des données.
Sans cette conversion, Oracle lèverait des erreurs lors de toute opération arithmétique sur des types texte, ou produirait des résultats incorrects lors de comparaisons implicites.
Syntaxe de TO_NUMBER
Voici la syntaxe officielle de la fonction TO_NUMBER sous Oracle :
TO_NUMBER( expression [, format_mask [, nls_params]] )
Paramètres
| Paramètre | Obligatoire | Description |
|---|---|---|
expression | Oui | La valeur à convertir. Généralement une chaîne de caractères ou une colonne de type texte. |
format_mask | Non | Le masque de format décrivant la structure de la valeur source (ex : '999G999D99' pour un nombre avec séparateur de milliers et décimales). |
nls_params | Non | Paramètres NLS permettant de définir les caractères utilisés comme séparateur décimal et séparateur de groupes selon la langue ou région ('NLS_NUMERIC_CHARACTERS = '',.'''). |
Principaux éléments du masque de format
| Élément | Signification | Exemple |
|---|---|---|
9 | Représente un chiffre (espace si absent) | '999' → 42 |
0 | Représente un chiffre (zéro si absent) | '099' → 042 |
D | Séparateur décimal (selon NLS) | '999D99' |
G | Séparateur de groupes (milliers, selon NLS) | '999G999' |
L | Symbole monétaire local | 'L999' |
MI | Signe négatif en fin de nombre | '999MI' |
Exemples pratiques de TO_NUMBER
Exemple 1 — Conversion simple d’un montant textuel en nombre
Contexte métier : Une table FACTURES_IMPORT reçoit des données d’un fichier CSV où les montants sont stockés sous forme de chaîne avec un point comme séparateur décimal. On souhaite calculer le total des montants.
-- Sélection et conversion des montants textuels en valeurs numériques
-- La colonne MONTANT_TEXTE contient des valeurs du type '1500.75', '320.00', etc.
SELECT
ID_FACTURE,
MONTANT_TEXTE,
TO_NUMBER(MONTANT_TEXTE, '999999D99') AS MONTANT_NUMERIQUE
FROM FACTURES_IMPORT;
-- Calcul du total en convertissant à la volée
SELECT
SUM(TO_NUMBER(MONTANT_TEXTE, '999999D99')) AS TOTAL_FACTURES
FROM FACTURES_IMPORT;
Dans cet exemple, le masque '999999D99' indique qu’on attend au maximum 6 chiffres entiers et 2 décimales, séparées par le caractère décimal NLS par défaut (ici le point).
Exemple 2 — Conversion avec séparateur de milliers et paramètres NLS
Contexte métier : Un système de gestion européen stocke des prix au format français : virgule comme séparateur décimal et espace comme séparateur de milliers. La table CATALOGUE_PRODUITS contient une colonne PRIX_TEXTE avec des valeurs comme '1 250,99'.
-- Conversion d'un nombre au format européen (virgule = décimale, espace = milliers)
-- NLS_NUMERIC_CHARACTERS = ', ' signifie : virgule pour les décimales, espace pour les milliers
SELECT
CODE_PRODUIT,
LIBELLE,
PRIX_TEXTE,
TO_NUMBER(
PRIX_TEXTE,
'999G999D99',
'NLS_NUMERIC_CHARACTERS = '', '''
) AS PRIX_NUMERIQUE
FROM CATALOGUE_PRODUITS;
-- Application d'une remise de 10 % sur le résultat converti
SELECT
CODE_PRODUIT,
ROUND(
TO_NUMBER(
PRIX_TEXTE,
'999G999D99',
'NLS_NUMERIC_CHARACTERS = '', '''
) * 0.90,
2
) AS PRIX_APRES_REMISE
FROM CATALOGUE_PRODUITS;
Le troisième paramètre NLS est ici crucial : sans lui, Oracle interpréterait la virgule comme un séparateur de milliers, ce qui provoquerait une erreur de conversion ou un résultat erroné.
Erreurs courantes avec TO_NUMBER
Erreur ORA-01722 : invalid number
C’est l’erreur la plus fréquente avec TO_NUMBER. Elle se produit lorsque la chaîne fournie ne correspond pas au masque de format spécifié, ou lorsqu’aucun masque n’est fourni et que la chaîne contient des caractères non numériques.
-- ❌ Exemple incorrect : la chaîne contient un symbole monétaire non pris en charge
SELECT TO_NUMBER('€1500.00') FROM DUAL;
-- Résultat : ORA-01722: invalid number
-- ✅ Solution 1 : nettoyer la chaîne avant conversion avec REGEXP_REPLACE
SELECT TO_NUMBER(REGEXP_REPLACE('€1500.00', '[^0-9\.]', '')) FROM DUAL;
-- Résultat : 1500
-- ✅ Solution 2 : utiliser le masque L pour le symbole monétaire local
-- (nécessite que le symbole corresponde au paramètre NLS_CURRENCY de la session)
SELECT TO_NUMBER('€1500.00', 'L9999D99', 'NLS_CURRENCY = ''€'' NLS_NUMERIC_CHARACTERS = ''.''')
FROM DUAL;
-- Résultat : 1500
Bonne pratique : Avant d’appliquer TO_NUMBER sur des données d’import, vérifiez toujours le format exact des valeurs sources et utilisez REGEXP_REPLACE ou TRANSLATE pour normaliser les chaînes si nécessaire.
Résumé
| Point clé | Détail |
|---|---|
| Fonction | TO_NUMBER(expression [, format [, nls]]) |
| Type retourné | NUMBER |
| Paramètre obligatoire | expression uniquement |
| Usage principal | Conversion de chaînes en nombres pour calculs et comparaisons |
| Masque de format | Recommandé dès que le format de la source est non standard |
| Paramètre NLS | Indispensable pour les formats régionaux (virgule, espace) |
| Erreur principale | ORA-01722 — chaîne non conforme au masque |
Deux bonnes pratiques Oracle
- Toujours spécifier le masque de format lorsque les données proviennent de sources externes (CSV, API, ERP). Une conversion implicite sans masque peut silencieusement échouer sur certaines lignes si les formats varient d’un enregistrement à l’autre.
- Combiner TO_NUMBER avec CASE ou REGEXP_LIKE pour sécuriser les conversions en masse : vérifiez d’abord que la chaîne est bien numérique avant de convertir, afin d’éviter qu’une seule ligne invalide ne bloque toute une requête.
Aller plus loin
Pour approfondir votre maîtrise des conversions et du formatage de données sous Oracle, découvrez ces sujets complémentaires :
- TO_CHAR Oracle — la fonction inverse de TO_NUMBER, permettant de formater un nombre ou une date en chaîne de caractères selon un masque personnalisé.
- TO_DATE Oracle — l’équivalent de TO_NUMBER pour les dates : convertir une chaîne en type DATE avec un masque de format précis.
- CAST Oracle — une alternative standardisée SQL ANSI pour convertir des types de données, compatible avec plusieurs SGBD et utile dans les environnements multi-bases.
