Изобщо няма нищо общо с декларацията за напред.
Това се отнася до факта, че използвате SQL заявка за извикване на функцията . Изглежда, че когато използвате оператор за извикване на функция, вече не сте в обхвата на PL/SQL пакета, поради което можете да извиквате само публично достъпни функции.
Що се отнася до защо , мога само да предполагам, така че не го приемайте за даденост, но PL/SQL и SQL имат различни машини . Така че, когато правите sql заявка, дори във вашия pl/sql пакет, отивате на ниво SQL, където ще провери отново разрешенията според SQL машината. Така че няма представа, че се изпълнява от PL/SQL пакет и трябва да ви бъде разрешено да извикате частната функция.
Мисля, че разликата между двигателите може да се провери лесно, опитайте се да използвате varchar2 от 32000, той ще работи във вашата pl/sql функция. Сега, ако извикате вашата pl/sql функция, връщаща varchar2(32000)
, ще се провали. Това е проблем, с който се сблъсках, но нямам база данни, за да ви дам фрагмент.