Ничего общего с предварительным объявлением вообще.
Это связано с тем фактом, что вы используете SQL-запрос для вызова функции. Похоже, что при использовании оператора для вызова функции вы больше не находитесь в рамках пакета PL/SQL, поэтому вы можете вызывать только общедоступные функции.
Что касается причин, я могу только догадываться, так что не принимайте это как должное, но PL/SQL и SQL имеют разные механизмы. Таким образом, при выполнении SQL-запроса, даже внутри вашего пакета pl/sql, вы переходите на уровень SQL, где он снова проверяет разрешения в соответствии с механизмом SQL. Таким образом, он понятия не имеет, что он выполняется из пакета PL/SQL, и вам должно быть разрешено вызывать частную функцию.
Я думаю, что разницу в двигателях можно легко проверить, попробуйте использовать varchar2 из 32000, он будет работать в вашей функции pl/sql. Теперь, если вы вызовете функцию pl/sql, возвращающую varchar2(32000)
, произойдет сбой. Это проблема, с которой я столкнулся, но у меня нет базы данных, чтобы дать вам фрагмент.
person
Plouf
schedule
07.02.2013