
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.
Le message
ORA-00936: missing expression
ORA-00936: expression absenteOracle 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-00936Si 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
- Affichez la requête finale (log/console) — pas le template, la chaîne réellement envoyée.
- Collez-la dans SQL Developer : il souligne précisément la position fautive.
- Cherchez : virgule avant FROM, clause vide, variable non substituée (
:paramresté littéral). - 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.
