ORA-00933 « SQL command not properly ended » : causes et solutions

ORA-00933 « SQL command not properly ended » : clause mal placée, point-virgule en trop, syntaxe MySQL/SQL Server… les causes et leurs correctifs Oracle.

Illustration de l'erreur Oracle ORA-00933

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.

Publicité

Le message

ORA-00933: SQL command not properly ended
ORA-00933: ordre SQL non terminé correctement

Astuce 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

  1. Collez la requête dans SQL Developer : il souligne la position exacte.
  2. Repérez tout ce qui ressemble à du MySQL/SQL Server (LIMIT, AS sur table, backticks `, #…).
  3. Vérifiez l’ordre des clauses.
  4. 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).

Publicité

Laisser un commentaire

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

Publicité