Oracle SQL-Develper: object MY_TABLE does not exist

Setzt man im SQL-Developer folgendes Desribe-Statement ab:

describe MY_TABLE ;

erhält man nur folgende Fehlermeldung:

ERROR: 
------------------------------------------- 
ERROR: object MY_TABLE  does not exist

Wer jetzt genau hinschaut sieht, dass zwischen dem Tabellennamen und dem Semikolon ein Leerzeichen sich befindet. Sobald man das entfernt läuft auch das Statement sauber durch.

Betrifft Oracle SQL-Developer in Version 4.0.2.15

ORA-00907: Rechte Klammer fehlt

ORACLE offeriert uns folgende Fehlermeldung:

ORA-00907: Rechte Klammer fehlt
 00907. 00000 - "missing right parenthesis"
 *Cause:
 *Action:
 Error at Line: 4 Column: 15

Es geht hierbei um das nachstehend geannte SQL, deren Sinnhaftigkeit irrelevant ist da das ursprünge SQL deutlich komplexer war, jedoch auf den ersten Blick technich korrekt erscheint – vor allem in Bezug auf die von ORACLE markierte Position:

SELECT *
  FROM users
 WHERE user_id != 100
   AND ( role_id IN (SELECT role_id
                      FROM userroles as r 
                     WHERE role_id NOT IN( 100 ) ) );

Die Analyse ergibt keine Fehler

  • Alle Klammern sind vollständig
  • Das SQL sieht fehlerfrei aus
  • Das Entfernen oder Ersetzen der äußeren IN-Bedingung löst die Fehlermeldung, lässt den Fehler jedoch nicht erkennen

Ursache

In der hier aufgeführten Query wurde ein Alias in der Subquery gesetzt welcher mit einem AS eingeleitet wurde, die von ORACLE jedoch als Tabellenalias nicht unterstützt werden. Die oben genannte Fehlermeldung führt einen nicht zu dem Problem an dieser Stelle.

Lösung

Die Aliaseinleitung AS entfernen und das SQL erneut ausführen.

Weitere mögliche Ursachen

Sollte die von mir geschilderte Problemlösung bei Dir nicht zutreffen kannst Du Deine Query auf folgende Punkte hin überprüfen:

  • Verwendung eines nicht erlaubten ORDER BY einer Subquerys oder innerhalb eines Joins:
SELECT *
  FROM users
 WHERE user_id != 100
   AND ( role_id IN (SELECT role_id
                       FROM userroles
                      WHERE role_id NOT IN( 100 ) 
                      ORDER BY role_id) );
  • Verwendung eines Joins mit Verweis einer Subquery:
...
LEFT JOIN userroles 
  ON userroles.role_id = ( SELECT max(role_id) 
                             FROM userroles )
...

Literatur zu diesem Thema: