webentwicklung-frage-antwort-db.com.de

ORA-00942: Tabelle oder View existiert nicht

Wenn ich eine SQL-Anweisung wie select * from table1, es funktioniert großartig, aber sobald ich es in eine Funktion stecke, bekomme ich:

ORA-00942: table or view does not exist 

Wie kann man das lösen?

23
Victor

Es gibt ein paar Dinge, die Sie sich ansehen können. Aufgrund Ihrer Frage sieht es so aus, als würde sich der Funktionseigentümer vom Tabelleneigentümer unterscheiden.

1) Berechtigungen über eine Rolle: Um gespeicherte Prozeduren und Funktionen für die Objekte eines anderen Benutzers zu erstellen, benötigen Sie direkten Zugriff auf die Objekte (anstatt über eine Rolle).

2)

Standardmäßig werden gespeicherte Prozeduren und SQL-Methoden mit den Berechtigungen ihres Besitzers und nicht ihres aktuellen Benutzers ausgeführt.

Wenn Sie eine Tabelle in Schema A und die Funktion in Schema B erstellt haben, sollten Sie sich die Konzepte von Oracle zu Invoker/Definer Rights ansehen, um zu verstehen, was das Problem möglicherweise verursacht.

http://download.Oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#LNPLS00809

16

Es besteht eine hohe Wahrscheinlichkeit, dass die Berechtigungen zum Auswählen aus Tabelle1 einer Rolle erteilt wurden und die Rolle Ihnen erteilt wurde. Berechtigungen, die einer Rolle erteilt wurden, sind für PL/SQL, das von einem Benutzer geschrieben wurde, nicht verfügbar, selbst wenn dem Benutzer die Rolle erteilt wurde.

Sie sehen dies häufig für Benutzer, denen die dba-Rolle für Objekte im Besitz von sys gewährt wurde. Ein Benutzer mit einer DBA-Rolle kann beispielsweise SELECT * from V$SESSION, Aber keine Funktion schreiben, die SELECT * FROM V$SESSION Enthält.

Das Update besteht darin, dem Benutzer explizite Berechtigungen für das betreffende Objekt direkt zu erteilen. In dem obigen Fall muss der SYS-Benutzer beispielsweise GRANT SELECT ON V_$SESSION TO MyUser;

35
Steve Broberg

Stellen Sie sicher, dass sich die Funktion im selben DB-Schema wie die Tabelle befindet.

3
Adrian Carneiro

Entweder haben Sie keine Berechtigung für dieses Schema/diese Tabelle OR). Meistens trat dieses Problem auf, wenn Sie in Ihren gespeicherten Prozeduren andere Schematabellen verwenden. Beispiel: Sie führen eine gespeicherte Prozedur vom Benutzer aus/schema ABC und in demselben PL/SQL befinden sich Tabellen, die vom Benutzer/schema XYZ stammen. In diesem Fall sollte ABC über GRANT-Berechtigungen für XYZ-Tabellen verfügen

Grant All On To ABC;

Select * From Dba_Tab_Privs Where Owner = 'XYZ'and Table_Name = <Table_Name>;
1

Eine sehr einfache Lösung ist das Hinzufügen des Datenbanknamens zu Ihrem Tabellennamen, z. B. wenn Ihr DB-Name DBMS und die Tabelle info ist, dann ist es DBMS.info für jede Abfrage.

Wenn Ihre Frage ist

select * from STUDENTREC where ROLL_NO=1;

es könnte aber ein fehler angezeigt werden

select * from DBMS.STUDENTREC where ROLL_NO=1; 

es nicht, weil jetzt tatsächlich Ihr Tisch gefunden wird.

1
Ankit Neekhra