2017-01-06 4 views
3

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.

+0

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

+1

Verfügt der Benutzer über Berechtigungen direkt oder über eine Rolle (z. B. DBA-Rolle)? –

+0

@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;' –

Antwort

0

Ich denke, dass Sie das Hauptproblem ist die Definition Ihrer Typen.

Sie müssen prüfen, welcher Typ in welcher Zeile verwendet wird.

Was sollten Sie haben:

user1 -> keine Typen, ein Paket, das Benutzer2-stuff nennt

user2 -> Typ1, Pack1, Proc1

Beispiel:

-- Create your type on schema user2 
CREATE OR REPLACE TYPE USER2.TestType AS OBJECT 
(
    NEWATTRIB1 VARCHAR2(1000) 
) 
/

-- Create your package at user2 
CREATE OR REPLACE PACKAGE user2.TestPackage AS 
    FUNCTION MyFunction(Param1 IN TestType) RETURN TestType; 
END TestPackage; 
/
CREATE OR REPLACE PACKAGE BODY user2.TestPackage AS 
    FUNCTION MyFunction(Param1 IN TestType) RETURN TestType IS 
    BEGIN 
    RETURN Param1; 
    END; 
END TestPackage; 
/

-- Grant rights user1 (run with user2) 
GRANT ALL ON TestType TO User1 WITH GRANT OPTION; 
GRANT EXECUTE ON TestPackage TO User1 WITH GRANT OPTION; 

-- Call proc from User1 
declare 
    tmp USER2.TestType; 
    tmp2 USER2.TestType; 
begin 
    tmp := USER2.TestType('Mr.Smith'); 

    tmp2 := USER2.TESTPACKAGE.MYFUNCTION(tmp); 

    dbms_output.put_line('tmp: ' || tmp.NEWATTRIB1); 
    dbms_output.put_line('tmp2: ' || tmp2.NEWATTRIB1); 
end; 

Bitte denken Sie daran: Zwei Arten sind nie gleich! Wenn Sie einen Typ in einem Schema verwenden, dürfen Sie keinen ähnlichen Typ in einem anderen Schema definieren, um das Objekt abzurufen. Sie müssen den Typ explizit im anderen Schema (= user2.type1) benennen. Sie müssen dem Schema/Benutzer, der den Typ verwenden will (in Ihrem Beispiel Grant-Typ- und Paket-Privilegien) Rechte gewähren.

Als Fehlersuche in einem bestehenden Projekt, können Sie es überprüfen Schritt-für-Schritt:

  1. Logon mit user1
  2. einige plsql schreiben die

    Ihre Art verwendet
    declare 
        tmp user2.type1; 
    begin 
        tmp := user2.type1('Mr.Smith'); 
        -- if this works, your type-privs are correct. 
    end; 
    
  3. schreiben einige plsql, die das Paket verwendet

Verwandte Themen