Veröffentlicht 23. März 20205 j Hallo, Ich schreibe gerade eine PL/SQL-Funktion, die auf die Dynamic Performance View V$TRANSPORTABLE_PLATFORM zurückgreifen muss. Das SQL-Statement lässt sich mit dem User ganz normal ausführen. Benutze ich dies aber in einer Funktion, sagt der Compiler, dass die View nicht vorhanden sei. Das selbe geschieht auch, wenn ich einfach eine View mit dem SQL-Statement: SELECT * FROM V$TRANSPORTABLE_PLATFORM erstellen möchte. Kann ich solche Views überhaupt in einer Funktion/View verwenden und wenn ja: Wie? Bearbeitet 23. März 20205 j von Whiz-zarD
23. März 20205 j Da musst du bei Oracle immer ziemlich aufpassen, ist leider unintuitiv. Erstens musst du mit den Grants aufpassen, innerhalb von PL/SQL-Blöcken werden Rollenprivilegien nicht geprüft, da sind dann also direkte Grants notwendig. Zweitens ist V$TRANSPORTABLE_PLATFORM ein Synonym für V_$TRANSPORTABLE_PLATFORM und auch da ist ein direkter Grant notwendig. Vermutlich liegt da das Problem.
23. März 20205 j Autor Danke für die Antwort. Dass es eigene Berechtigungen braucht, habe ich inzwischen auch gefunden. Ich bekomme aber weiterhin den selben Fehler. Irgendwas fehlt wohl noch.
24. März 20205 j Tja, was hast du denn genau gemacht? Folgendes Minimalbeispiel funktioniert bei mir Als DBA: CREATE USER TEST IDENTIFIED BY TEST DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS; GRANT CREATE SESSION TO TEST; GRANT CREATE VIEW TO TEST; GRANT SELECT ON V_$TRANSPORTABLE_PLATFORM TO TEST; GRANT CREATE PROCEDURE TO TEST; Mit User Test funktioniert dann dies alles: SELECT * FROM V$TRANSPORTABLE_PLATFORM; BEGIN EXECUTE IMMEDIATE('CREATE VIEW TESTVIEW AS SELECT * FROM V$TRANSPORTABLE_PLATFORM'); END; DECLARE v_test VARCHAR2(200); BEGIN SELECT PLATFORM_NAME INTO v_test FROM V$TRANSPORTABLE_PLATFORM WHERE ROWNUM <= 1; DBMS_OUTPUT.PUT_LINE(v_test); END; DECLARE v_test VARCHAR2(200); BEGIN SELECT PLATFORM_NAME INTO v_test FROM TESTVIEW WHERE ROWNUM <= 1; DBMS_OUTPUT.PUT_LINE(v_test); END; CREATE OR REPLACE PROCEDURE TESTOUT IS v_test VARCHAR2(200); BEGIN SELECT PLATFORM_NAME INTO v_test FROM TESTVIEW WHERE ROWNUM <= 1; DBMS_OUTPUT.PUT_LINE(v_test); END TESTOUT; EXECUTE TESTOUT;
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.