W ogóle nie ma nic wspólnego z deklaracją przekazania.
Dotyczy to faktu, że używasz zapytania SQL do wywołania funkcji . Wygląda na to, że kiedy używasz instrukcji do wywołania funkcji, nie jesteś już w zakresie pakietu PL/SQL, więc możesz wywoływać tylko publicznie dostępne funkcje.
Dlaczego , mogę się tylko domyślać, więc nie bierz tego za pewnik, ale PL/SQL i SQL mają różne silniki . Tak więc, wykonując zapytanie sql, nawet w swoim pakiecie pl/sql, przechodzisz na poziom SQL, gdzie ponownie sprawdza uprawnienia zgodnie z silnikiem SQL. Więc nie ma pojęcia, że jest wykonywany z pakietu PL/SQL i powinieneś mieć możliwość wywołania funkcji prywatnej.
Myślę, że różnicę silników można łatwo sprawdzić, spróbuj użyć varchar2 32000, będzie działać w ramach twojej funkcji pl/sql. Teraz, jeśli wywołasz swoją funkcję pl/sql zwracającą varchar2(32000)
, to się nie powiedzie. To jest problem, na który natknąłem się, ale nie mam żadnej bazy danych, aby dać ci fragment.