ORA-06502 « numeric or value error » : guide de résolution PL/SQL

ORA-06502 « numeric or value error » : variable trop petite, conversion impossible, dépassement… localisez la cause et corrigez votre code PL/SQL.

Illustration de l'erreur Oracle ORA-06502

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.

Publicité

🧪 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 value

Le 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 small

Correctif 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

  1. Lire la variante du message (buffer / conversion / null).
  2. Aller à la ligne indiquée par ORA-06512 (user_source).
  3. Identifier l’affectation : quelle variable ? quel type/taille déclaré ?
  4. Comparer avec la donnée réelle (MAX(LENGTH(col)), valeurs non numériques…).
  5. 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.

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité