Inget med vidaredeklaration att göra alls.
Detta handlar om det faktum att du använder en SQL-fråga för att anropa funktionen . Det verkar som att när du använder ett uttalande för att anropa en funktion, är du inte längre inom ramen för PL/SQL-paketet, så du kan bara anropa offentligt tillgängliga funktioner.
Varför , jag kan bara gissa, så ta det inte som givet, men PL/SQL och SQL har olika motorer . Så när du gör en sql-fråga, även inuti ditt pl/sql-paket, går du till SQL-nivån där den kontrollerar behörigheterna igen enligt SQL-motorn. Så den har ingen aning om att det körs inifrån ett PL/SQL-paket och du bör få anropa den privata funktionen.
Jag tror att skillnaden mellan motorer lätt kan kontrolleras, försök använda en varchar2 på 32000, det kommer att fungera inom din pl/sql-funktion. Om du nu anropar din pl/sql-funktion returnerar en varchar2(32000)
, det kommer att misslyckas. Det här är ett problem som jag stötte på, men jag har ingen databas som kan ge dig ett utdrag.