Ich verbinde mich mit einer Oracle-Datenbank als user1
. Innerhalb der Datenbank existiert user2
und hat ein Paket pack1
, das zwei gespeicherte Prozeduren proc1
und proc2
enthält.PLS-00201: Bezeichner 'TYPE' muss deklariert werden
Ich versuche, diese Verfahren aufzurufen, aber ich bekomme den oben genannten Fehler. Der Fehler erwähnt "Typ1", der in Typen definiert ist.
Nach einigen Nachforschungen wurde vorgeschlagen, Privilegien zu überprüfen, aber diese scheinen in Ordnung zu sein. Ich benutze Oracle SQL Developer und wenn ich auf die pack1
und type1
"Zuschüsse" klicke, hat mein Benutzer sowohl EXECUTE als auch DEBUG Privilegien.
Ich dachte, es war ein Fehler im Code, aber das würde einen anderen Fehler werfen. Ich dachte darüber nach, ein Synonym für das Paket zu erstellen, da ich gelesen habe, dass diese helfen können, aber ich habe nicht das nötige Recht dazu und bevor ich frage, wollte ich alle meine Möglichkeiten ausschöpfen.
Ich habe versucht, sowohl meinen vorbereiteten Aufruf als auch einen Standard zu verwenden, der von SQL Developer erstellt wurde, wenn ich versuche, diese gespeicherten Prozeduren auszuführen. Interessanterweise wird der angegebene Fehler ausgegeben, wenn ich meinen Code ausführe. Wenn ich den "Standard" -Code ausführe, erhalte ich den Fehler "Relativer Pfad in absolutem URI".
Gibt es etwas, was ich übersehen hätte?
Dies ist der Code, den ich verwende, um die Prozedur aufzurufen.
DECLARE
ClientData type1;
BEGIN
pack1.proc1(param1,param2,ClientData);
FOR i IN 1..ClientData.LAST LOOP
DBMS_OUTPUT.PUT_LINE(ClientData(i).kid ||' '...;
--DBMS_OUTPUT.PUT_LINE(ClientData(i).portfolioName);
--DBMS_OUTPUT.PUT_LINE(ClientData(i).clientCategory);
--DBMS_OUTPUT.PUT_LINE(ClientData(i).typ_pf);
--DBMS_OUTPUT.PUT_LINE(ClientData(i). ptf_ccy);
END LOOP;
END;
EDIT 1: hier ist der vollständige Fehler:
ORA-06550: row 2, column 14:
PLS-00201: identifier 'SYSADMIN(user2).CLIENTDATAINSTRESB_A(type1)' must be declared
ORA-06550: row 2, column 14:
PL/SQL: Item ignored
ORA-06550: row 4, column 53:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: row 4, column 1:
PL/SQL: Statement ignored
ORA-06550: row 5, column 13:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: row 5, column 1:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
Unter normalen Umständen würde ich den Körper des Verfahrens ist es aber Geschäft ist und daher etwas, was ich nicht teilen kann.
Von dem, was ich verstehe, am Anfang des Aufrufs, Deklaration fehlschlägt und daher ergibt es den Rest der Fehler, da diese den Orten entsprechen, wo der "Typ1" aufgerufen wird.
Um zu erklären, was 'type1' ist, ist es ein Verweis auf eine Tabelle ('type2'). Es wird von folgenden Code erstellt:
create or replace TYPE type1 IS TABLE OF type2;
EDIT 2 als @ Alex Poole vorgeschlagen, ich habe meine Erklärung geändert:
DECLARE
ClientData user2.type1;
es jedoch reproduziert den gleichen Fehler:
PLS-00201: identifier 'user2.type1' must be declared
EDIT 3
Die falschen Namen wurden von mir verursacht, um den Code zu sterilisieren, es wurde behoben.
Die Pakete und die beiden Typen gehören dem Benutzer2. Wenn ich mich mit der Datenbank verbinde, sehe ich nichts aus meiner Perspektive. Keine Tabellen, Pakete oder Typen. Nur wenn ich "Andere Benutzer" blicke und in die Perspektive von Benutzer2 schaue, kann ich die erforderlichen Prozeduren sehen.
Auch ich bin positiv, dass ich Privilegien (EXECUTE & DEBUG) zu allen erforderlichen Objekten habe. Das sind Pakete, und definiert
Wenn wir darüber sprechen, wie die Privilegien gewährt wurden, gibt es eine Möglichkeit, das zu überprüfen?Ich verwenden Befehl
SELECT * FROM USER_TAB_PRIVS;
Die benutzer2 als Grantor und Inhaber und benutzer1 als Grantee
EDIT 4
Dies ist das Ergebnis von SELECT * FROM USER_TAB_PRIVS auflistet;
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY COMMON TYPE
USER1 USER2 TYPE2 USER2 DEBUG NO NO NO TYPE
USER1 USER2 TYPE2 USER2 EXECUTE NO NO NO TYPE
USER1 USER2 TYPE1 USER2 DEBUG NO NO NO TYPE
USER1 USER2 TYPE1 USER2 EXECUTE NO NO NO TYPE
USER1 USER2 PACK1 USER2 DEBUG NO NO NO PACKAGE
USER1 USER2 PACK1 USER2 EXECUTE NO NO NO PACKAGE
PUBLIC SYS USER1 USER1 INHERIT PRIVILEGES NO NO NO USER
EDIT 5: Die Ergebnistabelle wurde von Klein- zu Großbuchstaben korrigiert. Wie vorgeschlagen, habe ich jedoch die Namen des Pakets und die Typen überprüft, sie sind in der Tat in Großbuchstaben.
Wh at is 'Types' - ein anderes Paket, das Dinge einschließlich' type1' definiert? Oder ist "type1" ein SQL-Level-Typ? Welcher Benutzer besitzt die Pakete/Typen und an welcher Stelle betreiben Sie diesen anonymen Block? –
Verfügt der Benutzer über Berechtigungen direkt oder über eine Rolle (z. B. DBA-Rolle)? –
@AlexPoole Tut mir leid, dass ich nicht aufgeräumt habe. 'type1' ist eine Tabelle von 'type2'. Um es klarer zu machen, hier ist der Code: 'create or replace TYPE type1 IS TABLE von type2;' –