
ORA-06502 « PL/SQL: numeric or value error » se déclenche quand une valeur ne « rentre pas » dans la variable PL/SQL qui doit la recevoir : chaîne trop longue, conversion impossible, NULL interdit ou dépassement numérique. L’erreur arrive à l’affectation — voici comment localiser la variable fautive et les correctifs durables.
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
Les variantes du message
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06502: PL/SQL: numeric or value error: NULL index table key valueLe suffixe vous oriente : buffer too small = variable trop petite ; conversion error = conversion texte→nombre ratée ; etc. La ligne exacte est donnée par ORA-06512 juste en dessous.
Cause 1 — « character string buffer too small » (la plus fréquente)
DECLARE
v_nom VARCHAR2(10);
BEGIN
SELECT nom INTO v_nom FROM clients WHERE id = 42; -- nom = 'Vandenberghe' (12 car.)
END;
-- ORA-06502: character string buffer too smallCorrectif robuste : ancrer le type sur la colonne — la variable suit automatiquement les évolutions de la table :
DECLARE
v_nom clients.nom%TYPE; -- ✅ toujours à la bonne taille
BEGIN
SELECT nom INTO v_nom FROM clients WHERE id = 42;
END;Pièges associés : concaténations qui dépassent (v_msg VARCHAR2(100) := v_a || v_b), et différence CHAR/BYTE — avec l’UTF-8, ‘é’ = 2 octets : déclarez VARCHAR2(50 CHAR) si vous comptez en caractères.
Cause 2 — « character to number conversion error »
DECLARE
v_qte NUMBER;
BEGIN
v_qte := 'douze'; -- ❌
v_qte := TO_NUMBER(p_param); -- ❌ si p_param = '12a'
END;Correctifs : valider en amont, ou conversion tolérante (12c R2+) :
v_qte := TO_NUMBER(p_param DEFAULT -1 ON CONVERSION ERROR);
IF v_qte = -1 THEN
RAISE_APPLICATION_ERROR(-20002, 'Quantité invalide : ' || p_param);
END IF;(En SQL pur, la même famille d’erreur sort en ORA-01722.)
Cause 3 — Dépassement de précision NUMBER
DECLARE
v_taux NUMBER(3,2); -- max 9.99
BEGIN
v_taux := 12.5; -- ORA-06502
END;Vérifiez la précision déclarée NUMBER(p,s) face aux valeurs réelles — particulièrement dans les paramètres de procédures où l’appelant ne voit pas la contrainte.
Cause 4 — NULL affecté à une variable NOT NULL (ou index NULL)
DECLARE
v_id NUMBER NOT NULL := 1;
BEGIN
v_id := NULL; -- ORA-06502
END;Et avec les tableaux associatifs : ma_table(NULL) := 'x'; → « NULL index table key value ». Contrôlez les valeurs venant de curseurs/paramètres avant affectation.
Méthode de diagnostic express
- Lire la variante du message (buffer / conversion / null).
- Aller à la ligne indiquée par ORA-06512 (
user_source). - Identifier l’affectation : quelle variable ? quel type/taille déclaré ?
- Comparer avec la donnée réelle (
MAX(LENGTH(col)), valeurs non numériques…). - Corriger en %TYPE ou en validation amont — pas en « +10 » sur la taille au hasard.
-- la donnée la plus longue d'une colonne
SELECT MAX(LENGTH(nom)) FROM clients;FAQ
Pourquoi l’erreur n’apparaît qu’en production ?
Les données de prod contiennent des valeurs plus longues/sales que vos jeux de test. L’ancrage %TYPE et des tests sur données réelles anonymisées évitent la surprise.
%TYPE protège-t-il à 100% ?
Contre les décalages variable/colonne, oui. Mais pas contre une concaténation qui dépasse ou une conversion invalide — gardez la validation amont.
VARCHAR2(50) : caractères ou octets ?
Par défaut, des octets (paramètre NLS_LENGTH_SEMANTICS). En UTF-8, préférez VARCHAR2(50 CHAR) pour raisonner en caractères.
