SQL Programmierer

ORA-00936: Ausdruck fehlt

Eine recht häufige Fehlermeldung in der Oracle Datenbank betrifft die SQL Syntax:
ORA-00936: Ausdruck fehlt
In der Regel muss das SQL dann ergänzt werden. Jedoch gibt es auch Fälle wo die Fehlermeldung irreführend ist. Dieser Fehler kommt nicht nur, wenn man etwas weggelassen hat, sondern oft auch da wo gar kein Ausdruck fehlt. Zum Beispiel wenn die Select Liste der Abfrage am Ende ein Komma hat das da nicht hingehört. Er passiert auch unerwartet wegen Sonderregeln der Syntax bei Unterabfragen. Verwendet man als Argument einer Funktion eine Unterabfrage, dann braucht es doppelte statt einfache Klammern: Zur Erläuterung:

SELECT TRIM(COLUMNNAME) FROM MYTABLE

ist korrekt.

SELECT TRIM(SELECT COLNAME FROM OTHERTABLE WHERE...) FROM MYTABLE

ist nicht korrekt und führt zu so einer Fehlermeldung.

SELECT TRIM((SELECT COLNAME FROM OTHERTABLE WHERE...)) FROM MYTABLE

So ist das korrekt, es braucht seltsamerweise eine doppelte Klammerung, einmal die Klammer der Funktionsargumente und zusätzlich die Klammer des Subselect. Die Fehlermeldung, dass ein Ausdruck fehlt ist da fehl am Platz. Auf docs.oracle.com wird erklärt:
In all cases, a scalar subquery must be enclosed in its own parentheses, even if its syntactic location already positions it within parentheses (for example, when the scalar subquery is used as the argument to a built-in function).
Obwohl das trivial ist wird das doch häufig übersehen, weil es nicht ins Weltbild der Programmierung passt. Hier verhält sich SQL anders als man es von den Klammerregeln der meisten Programmiersprachen gewohnt ist. Ferner fällt man darauf herein, wenn man mittels Suchen und Ersetzen schnell Änderungen im Programm umsetzen will. Ersetzt man in den Datenbankabfragen eine Tabellenspalte durch ein Subselect oder umgekehrt, muss man aufpassen. Oder wenn das SQL aus Variablen einer anderen Programmiersprache dynamisch aufgebaut wird, darf man Subselects und Spaltennamen nicht einfach austauschen in der Variablen, sonst wird ein korrektes Programm zur Laufzeit doch noch fehlerhaft. Aber es funktioniert ganz gut, wenn man die Klammern des Subselect gleich in die Variable aufnimmt. Also wenn die Fehlermeldung kommt ist das nur manchmal einem fehlenden Ausdruck geschuldet. Vielmehr ist es eine allgemeine Syntaxwarnung, die diverse Ursachen haben kann.