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?
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%