
ORA-00933 « SQL command not properly ended » signifie qu’Oracle a compris le début de votre requête, mais qu’il bute sur quelque chose après la fin attendue. Presque toujours : une clause mal placée, un point-virgule de trop, ou une syntaxe d’un autre SGBD (MySQL/SQL Server) qui n’existe pas en Oracle. Voici les causes et leurs correctifs.
Le message
ORA-00933: SQL command not properly ended
ORA-00933: ordre SQL non terminé correctementAstuce de lecture : le problème se situe juste avant l’endroit signalé par Oracle. La commande était valide jusque-là, puis un élément « en trop » apparaît.
Cause 1 — Syntaxe d’un autre SGBD (le grand classique)
Beaucoup d’erreurs ORA-00933 viennent d’une habitude MySQL ou SQL Server :
-- ❌ LIMIT n'existe pas en Oracle
SELECT * FROM clients LIMIT 10;
-- ✅ Oracle 12c+
SELECT * FROM clients FETCH FIRST 10 ROWS ONLY;-- ❌ AS pour un alias de TABLE (interdit en Oracle)
SELECT c.nom FROM clients AS c;
-- ✅ pas de AS pour les tables
SELECT c.nom FROM clients c;Voir nos guides FETCH FIRST et OFFSET pour la pagination Oracle.
Cause 2 — Clause dans le mauvais ordre
L’ordre des clauses SQL est strict : SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY.
-- ❌ ORDER BY avant WHERE
SELECT * FROM ventes ORDER BY date_vente WHERE montant > 100;
-- ✅
SELECT * FROM ventes WHERE montant > 100 ORDER BY date_vente;Cause 3 — Point-virgule en trop (surtout via une application)
L’API JDBC/OCI n’aime pas le ; final dans une requête unique :
-- ❌ via du code applicatif
stmt.executeQuery("SELECT * FROM clients;"); // le ; provoque ORA-00933
-- ✅ retirer le point-virgule
stmt.executeQuery("SELECT * FROM clients");(En SQL*Plus / SQL Developer, le ; est au contraire le terminateur normal — d’où la confusion.)
Cause 4 — Plusieurs ordres collés sans séparation
-- ❌ deux requêtes envoyées comme une seule
SELECT * FROM a SELECT * FROM b
-- ✅ il fallait un UNION, ou deux exécutions séparées
SELECT * FROM a UNION ALL SELECT * FROM b;Cause 5 — Mot-clé mal orthographié ou de trop
-- ❌ "INTO" n'a rien à faire ici
SELECT nom INTO FROM clients;
-- ❌ virgule avant ORDER BY
SELECT nom, FROM clients ORDER BY nom;Méthode de diagnostic
- Collez la requête dans SQL Developer : il souligne la position exacte.
- Repérez tout ce qui ressemble à du MySQL/SQL Server (LIMIT, AS sur table, backticks
`,#…). - Vérifiez l’ordre des clauses.
- Si l’erreur vient d’une appli : enlevez le
;final et loggez la requête réellement envoyée.
FAQ
Quelle différence avec ORA-00936 ?
ORA-00936 = il manque une expression. ORA-00933 = il y a quelque chose en trop après une commande déjà complète.
Pourquoi ma requête marche dans SQL Developer mais pas dans mon code ?
Le point-virgule final : accepté (et attendu) par SQL Developer, refusé par l’API JDBC/OCI pour une requête unique.
Oracle accepte-t-il AS pour les alias ?
Oui pour les colonnes (prix AS prix_ttc), non pour les tables (FROM clients c, sans AS).
