Warum bekomme ich PLS-00302: Komponente deklariert werden muss, wenn es existiert?
Ich bin mit Oracle 10.2.
Arbeite ich in einigen scripts zu bewegen, einige ORACLE-Objekte von einem SCHEMA (S1) zu einem anderen (S2).
Ich bin mit der Erstellung der Funktionen mit einer DBA-Rolle werden.
Wenn Sie verschoben, eine meiner Funktionen, ungültig, aber ich verstehe nicht warum.
Ihr code geht in diese Richtung:
MY_FUNC
CREATE OR REPLACE FUNCTION S2."MY_FUNC" RETURN VARCHAR2 IS
something VARCHAR2;
othervar VARCHAR2 (50):= 'TEST';
BEGIN
something := S2.MY_FUNC2();
/*some code*/
return othervar;
END;
/
Wenn ich MY_FUNC2
ohne das schema, Es funktioniert:
something := MY_FUNC2();
statt something := S2.MY_FUNC2();
My_FUNC2
CREATE OR REPLACE FUNCTION S2."MY_FUNC2" RETURN VARCHAR2 IS
something BOOLEAN;
othervar VARCHAR2 (50) := 'TEST2';
BEGIN
/*some code*/
return othervar;
END;
/
MY_FUNC2 hat ein synonym, wie diese:
CREATE OR REPLACE PUBLIC SYNONYM "MY_FUNC2" FOR "S2"."MY_FUNC2"
MY_FUNC
kompiliert mit Fehler:
PLS-00302: Komponente 'MY_FUNC2' muss deklariert werden
Ich verstehe nicht, warum ich diese Fehlermeldung bekommen, wenn meine Funktionen wurden in das andere schema (S1) Sie hatte genau die gleiche Struktur und das synonym wurde exakt der gleichen (aber zeigt auf S1) und MY_FUNC
zusammengestellt in Ordnung.
Ich nicht erstellen, die diese Funktionen und ursprünglich synonym. Ist es möglich, dass ich bin fehlen einige Privilegien in S2, so MY_FUNC
richtig arbeiten kann?
- rufen Sie die Funktion von s1 oder s2?
- Wenn Sie den Aufruf von s1, die Sie brauchen zu geben, die grant execute-Privileg auf s2.MY_FUNC2 zu s1.
- soweit ich das verstanden habe ist dies nicht zu nennen, es gar nicht kompilieren. Also nur um sicher zu gehen, denn es ist nicht klar, aus Ihrer Frage. Sie sind angemeldet als sys oder s2? Zuerst erstellt MY_FUNC2, dann erstellt public synonym, und dann MY_FUNC? WENN Sie SYS oder S2 mit create public synonym-Privileg und hat es in dieser Reihenfolge gibt es keinen Grund, nicht zu kompilieren (ausser, dass my_func Erklärung hat varchar2; ohne Genauigkeit)
- alles ist in S2, und ich bin angemeldet mit einer DBA-Rolle werden. Die Frage war, wie unten beschrieben von Alex.
- Eine ANDERE LÖSUNG: stackoverflow.com/questions/2834596/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erhalten Sie diesen Fehler, wenn Sie ein Objekt mit dem gleichen Namen wie das schema. Zum Beispiel:
Wenn Sie finden
S2.MY_FUNC2
den Objekt-Namen aufgelöst wird, so dass es nicht versuchen zu bewerten, S2 als schema-name. Wenn Sie gerade nennen Sie es, wieMY_FUNC2
es gibt keine Verwirrung, so dass es funktioniert.In der Dokumentation erklärt die Namensauflösung. Das erste Stück des qualifizierten Objekts name - S2 hier wird ausgewertet, wie ein Objekt auf das aktuelle schema, bevor es ausgewertet wird, als ein anderes schema.
Könnte es nicht sein, eine Sequenz; andere Objekte können bewirken, dass die gleichen Fehler. Sie können prüfen, die Existenz von Objekten mit dem gleichen Namen durch Abfrage des data dictionary.
Ich bin hierher gekommen, weil ich hatte das gleiche problem.
Was war das problem für mich war, dass das Verfahren war im Paket definierten Körper, aber nicht in den Paket-header.
Ich war ausgeführt, meine Funktion mit einem verlieren BEGIN-END-Anweisung.