Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fehler beim Aufrufen einer beliebigen Funktion in einer SQL-Abfrage in einem Paket, ohne die Funktion in der Paketspezifikation zu deklarieren

Überhaupt nichts mit Forward-Deklaration zu tun.

Dies betrifft die Tatsache, dass Sie eine SQL-Abfrage verwenden, um die Funktion aufzurufen . Wenn Sie eine Anweisung zum Aufrufen einer Funktion verwenden, scheinen Sie sich nicht mehr im Geltungsbereich des PL/SQL-Pakets zu befinden, sodass Sie nur öffentlich verfügbare Funktionen aufrufen können.

Zum Warum , kann ich nur vermuten, also nehmen Sie es nicht als selbstverständlich hin, aber PL/SQL und SQL haben unterschiedliche Engines . Wenn Sie also eine SQL-Abfrage durchführen, gehen Sie sogar innerhalb Ihres pl/sql-Pakets auf die SQL-Ebene, wo die Berechtigungen gemäß der SQL-Engine erneut überprüft werden. Es hat also keine Ahnung, dass es innerhalb eines PL/SQL-Pakets ausgeführt wird, und Sie sollten berechtigt sein, die private Funktion aufzurufen.

Ich denke, der Unterschied der Engines kann leicht überprüft werden, versuchen Sie, ein varchar2 von 32000 zu verwenden, es funktioniert innerhalb Ihrer pl/sql-Funktion. Wenn Sie nun Ihre pl/sql-Funktion aufrufen, die einen varchar2(32000) zurückgibt , es wird scheitern. Dies ist ein Problem, auf das ich gestoßen bin, aber ich habe keine Datenbank, um Ihnen einen Ausschnitt zu geben.