Wenn das Minuszeichen zu einem ORA-00923 führt

Wenn das Minuszeichen zu einem ORA-00923 führt

Rate This
  • Comments 1

Die Aufgabenstellung für den DBA war nicht so schwer: Wie viele Tage sind in diesem Jahr bereits vergangen? Die SQL-Funktion war schnell parat, ein  TRUNC musste her kombiniert mit einem SYSDATE, dann kurz subtrahieren und schon sollte das Ergebnis da sein. Aber was ist passiert? Anstelle der  erwarteten Anzahl vergangener Tage war das Ergebnis ein ORA-00923: FROM keyword not found where expected

Erste Ausführung:  ORA-00923

Hier der erste Versuch im SQL Developer 4 mit einer Oracle Datenbank 12c. Aber gleich vorneweg, das hat nichts mit den Versionen zu tun – das Verhalten ist mit einer SQL*"Plus Session und Oracle 11gR2 Datenbank exakt dasselbe…

screenhot_1

Zweite Ausführung – alles auf eine Zeile

Gemäss der Fehlermeldung ORA-00923 wurde das FROM-Kriterium nicht erkannt. Versuchen wir mal das ganze SELECT mit allen Kriterien auf eine Zeile zu schreiben. Und siehe da, das Statement wird richtig erkannt. Die Anzahl Tage werden zurückgegeben.

screenhot_2

Dritte Ausführung – Minuszeichen auf neue Zeile

Ein neuer Versuch mit einer anderen Anordnung, Das Minuszeichen auf einer neuen Zeile. Auch hier wurde das Statement korrekt geparst, der Wert stimmt.

screenhot_3

Vierte Ausführung – Minuszeichen am Ende der zweiten Zeile

Ein weiterer Versuch, das Minuszeichen am Ende der zweiten Zeile, das erste Kriterium SYSDATE bleibt stehen. Auch hier stimmt das Statement.

screenhot_4

Es muss also was mit dem Minuszeichen zu tun haben, und auch nur dann wenn es auf der ersten Zeile steht. Bei der Suche nach dem ORA-00923 Fehler  auf der My Oracle Support Platform bin ich auf folgende Note gestossen:

Hyphen at the End of the Line in SQL Statement gives Error ORA-00923 (Doc ID 292331.1)

Weitere Informationen finden wir im SQL”Plus User Guide:

http://docs.oracle.com/cd/E16655_01/server.121/e18404/ch_four.htm#SQPUG400

Und zwar wird das vermeintliche Minuszeichen am Ende der ersten Zeile nicht als solches erkannt, sondern als “continuation character” interpretiert, Also als Zeichen dafür, dass der Code weitergeführt wird. Das kann auf Anhieb wie folgt gelöst werden:

  • a) Man schreibt den Code mit der Subtraktion auf eine Zeile, wie im 2. Versuch
  • b) Es muss ein zweites “Minuszeichen”, im Englischen “Hyphen” genannt, dem Statement hinzugefügt werden

Variante b) mit zwei Minuszeichen – das Ergebnis stimmt auch hier

screenhot_5

Die Fehlermeldung erscheint in dieser Konstellation nur im SQL*Developer oder in SQL*Plus. Toad beispielweise kann das Minuszeichen auch als solches interpretieren.

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment
  • Post
  • Hi Martin,

    eine nette Geschichte! :-)

    Dieses Minus am Ende als Zeilenfortsetzungszeichen findet oft Anwenung, wenn man PL/SQL Aufrufe aus SQL*Plus macht, sich dank EXECUTE klammernde BEGIN und END sparen will, es dennoch einigermaßen lesbar lassen will.

    Beispiel:

    EXEC dbms_streams_auth.grant_admin_privilege( -

     grantee => 'STRMADMIN', -

     grant_privileges => TRUE -

    );

    Gruß Mathias

Page 1 of 1 (1 items)