ORA-00936 « missing expression » : causes et solutions SQL

ORA-00936 « missing expression » : virgule en trop, clause vide, fonction incomplète… les causes de cette erreur de syntaxe SQL et leurs fixes.

Illustration de l'erreur Oracle ORA-00936

ORA-00936 « missing expression » signifie qu’Oracle attendait une expression (une colonne, une valeur, un calcul) à un endroit précis de votre requête… et n’a rien trouvé. C’est presque toujours une erreur de syntaxe : virgule en trop, mot-clé mal placé, ou clause incomplète. Voici les cas les plus fréquents et leur correction immédiate.

Publicité

Le message

ORA-00936: missing expression
ORA-00936: expression absente

Oracle indique souvent la position approximative. Lisez la requête juste avant le point signalé : l’élément manquant est là.

Cause 1 — Virgule en trop avant FROM

-- ❌ virgule orpheline après "ville,"
SELECT nom, prenom, ville, FROM clients;
-- ✅
SELECT nom, prenom, ville FROM clients;

La cause n°1, surtout quand on construit le SELECT par concaténation dans du code applicatif.

Cause 2 — SELECT … FROM vide ou tronqué

-- ❌ rien entre SELECT et FROM
SELECT  FROM commandes;
-- ❌ requête générée dont la liste de colonnes est vide
"SELECT " + colonnes + " FROM t"   // colonnes = "" → ORA-00936

Si la requête est construite dynamiquement, loggez la chaîne finale avant exécution : 9 fois sur 10, une variable est vide.

Cause 3 — Mot-clé sans son expression

-- ❌ WHERE sans condition
SELECT * FROM ventes WHERE;
-- ❌ ORDER BY / GROUP BY sans colonne
SELECT * FROM ventes ORDER BY;
-- ❌ AND en fin de filtre
SELECT * FROM ventes WHERE actif = 'O' AND;

Encore un grand classique du SQL généré : on ajoute AND en boucle et la dernière condition manque.

Cause 4 — Fonction ou parenthèse incomplète

-- ❌ NVL attend 2 arguments
SELECT NVL(remise) FROM produits;
-- ✅
SELECT NVL(remise, 0) FROM produits;

-- ❌ parenthèse ouverte vide
SELECT * FROM t WHERE id IN ();

Cause 5 — Alias ou opérateur attendant une suite

-- ❌ AS sans nom d'alias
SELECT prix * quantite AS FROM lignes;
-- ❌ opérateur sans opérande droite
SELECT prix * FROM lignes;

Méthode pour les requêtes générées par code

  1. Affichez la requête finale (log/console) — pas le template, la chaîne réellement envoyée.
  2. Collez-la dans SQL Developer : il souligne précisément la position fautive.
  3. Cherchez : virgule avant FROM, clause vide, variable non substituée (:param resté littéral).
  4. Utilisez des requêtes paramétrées (bind variables) plutôt que de la concaténation — ça élimine la majorité des ORA-00936 (et les injections SQL).

FAQ

ORA-00936 vs ORA-00904, comment les distinguer ?

ORA-00936 = il manque quelque chose (syntaxe incomplète). ORA-00904 = quelque chose est présent mais inconnu (colonne inexistante).

Ma requête marche dans un outil mais pas dans mon application ?

L’application construit probablement la requête différemment (variable vide, paramètre non remplacé). Loggez la chaîne SQL finale envoyée par l’app.

Comment éviter ce type d’erreur en SQL dynamique ?

Construisez les listes de colonnes/conditions dans un tableau puis faites un join avec virgule/AND, et utilisez des bind variables. Plus de virgule ni de AND orphelins.

Publicité

Laisser un commentaire

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

Publicité