Наиболее вероятной причиной является то, что у вас есть доступ через роль не напрямую, что означает, что вы можете запускать ее в SQL, но для процедуры PLSQL вам нужна прямая привилегия.
Согласно руководству разработчика приложений:
Права, необходимые для создания процедур и функций
Чтобы создать отдельную процедуру или функцию, или спецификацию пакета или
Тело, вы должны соответствовать следующим предпосылкам:
Вы должны иметь системную привилегию CREATE PROCEDURE, чтобы создать
процедура или пакет в вашей схеме, или СОЗДАТЬ ЛЮБОЙ
Системная привилегия PROCEDURE для создания процедуры или пакета в
схема другого пользователя.
Внимание: создать без ошибок, то есть скомпилировать процедуру
или пакет успешно, требует следующих дополнительных привилегий:
Владелец процедуры или пакета должен быть явно
предоставил необходимые объектные привилегии для всех объектов, на которые есть ссылки
тело кода; владелец не может получить требуемый
привилегии через роли.
Если привилегии владельца процедуры или пакета меняются, процедура
должны быть повторно аутентифицированы перед выполнением. Если необходимая привилегия для
указанный объект отзывается у владельца процедуры (или пакета),
процедура не может быть выполнена.
Простой способ проверить вещи:
SQL> set role none;
SQL> "statement you want to test to see if it'll work in a procedure"
Так что вы можете просто пропустить некоторые прямые гранты для этих объектов.