Intet at gøre med fremadrettet erklæring overhovedet.
Dette omhandler det faktum, at du bruger en SQL-forespørgsel til at kalde funktionen . Det ser ud til, at når du bruger en sætning til at påkalde en funktion, er du ikke længere inden for rammerne af PL/SQL-pakken, så du kan kun kalde offentligt tilgængelige funktioner.
Med hensyn til hvorfor , jeg kan kun gætte, så tag det ikke som givet, men PL/SQL og SQL har forskellige motorer . Så når du laver en sql-forespørgsel, selv inde i din pl/sql-pakke, går du til SQL-niveauet, hvor den igen tjekker tilladelserne i henhold til SQL-motoren. Så den aner ikke, at den udføres fra en PL/SQL-pakke, og du bør have lov til at kalde den private funktion.
Jeg tror, at forskellen på motorer nemt kan kontrolleres, prøv at bruge en varchar2 på 32000, det vil fungere inden for din pl/sql-funktion. Nu, hvis du kalder din pl/sql-funktion returnerer en varchar2(32000)
, vil det mislykkes. Det er et problem, jeg stødte på, men jeg har ikke nogen database til at give dig et uddrag.