Warum bekomme ich PLS-00302: Komponente muss deklariert werden, wenn sie existiert?

8

Ich verwende Oracle 10.2.

Ich arbeite in einigen Skripten, um einige ORACLE-Objekte von einem SCHEMA (S1) zu einem anderen zu verschieben (S2). Ich erstelle die Funktionen mit DBA-Rolle. Beim Verschieben wird eine meiner Funktionen ungültig, aber ich verstehe nicht warum. Sein Code folgt diesen Zeilen:

MY_FUNC

%Vor%

Wenn ich MY_FUNC2 ohne das Schema verwende, funktioniert es:
something := MY_FUNC2(); anstatt something := S2.MY_FUNC2();

My_FUNC2

%Vor%

MY_FUNC2 hat ein Synonym wie folgt:

%Vor%

MY_FUNC kompiliert mit Fehlern:

  

PLS-00302: Die Komponente 'MY_FUNC2' muss deklariert werden

Ich verstehe nicht, warum ich diesen Fehler bekomme, als meine Funktionen im anderen Schema waren (S1) hatten sie genau die gleiche Struktur und das Synonym wurde genau gleich erzeugt (aber auf S1) und MY_FUNC gut zusammengestellt.

Ich habe diese Funktionen und das Synonym ursprünglich nicht erstellt. Ist es möglich, dass mir in S2 einige Privilegien fehlen, damit MY_FUNC richtig funktionieren kann?

    
Dzyann 24.02.2015, 20:56
quelle

2 Antworten

13

Sie können diesen Fehler erhalten, wenn Sie ein Objekt mit demselben Namen wie das Schema haben. Zum Beispiel:

%Vor%

Wenn Sie auf S2.MY_FUNC2 verweisen, wird der Objektname aufgelöst, sodass S2 nicht als Schemaname ausgewertet wird. Wenn Sie es einfach als MY_FUNC2 nennen, gibt es keine Verwirrung, also funktioniert es.

Die Dokumentation erklärt die Namensauflösung . Das erste Stück des qualifizierten Objektnamens - hier S2 - wird als Objekt im aktuellen Schema ausgewertet, bevor es als anderes Schema ausgewertet wird.

Es könnte keine Sequenz sein; Andere Objekte können den gleichen Fehler verursachen. Sie können die Existenz von Objekten mit demselben Namen prüfen, indem Sie das Datenwörterbuch abfragen.

%Vor%     
Alex Poole 24.02.2015, 23:55
quelle
3

Ich kam hierher, weil ich das gleiche Problem hatte.
Was war das Problem für mich war, dass die Prozedur im Paketkörper definiert wurde, aber nicht im Paketheader.
Ich habe meine Funktion mit einer BEGIN END-Anweisung ausgeführt.

    
Tenzin 08.12.2016 09:39
quelle

Tags und Links